首页 > 其他分享 >Comet OJ - Contest #13[A-D]

Comet OJ - Contest #13[A-D]

时间:2023-05-31 10:06:33浏览次数:66  
标签:tmp 13 return OJ int ans Comet mx const


题目链接:https://www.cometoj.com/contest/71/problems

 

A.「壶中的大银河」

水题

B.「龙颈之玉 -五色的弹丸-」

用一个双向队里维护一下贪吃蛇某个点的前一个位置方向是啥就好了

#include<bits/stdc++.h>
#define x first
#define y second
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair <int,int> pa;
const int mx = 400 + 10;
const int mod = 1e9 + 7;
const int dx[4] = {1,-1,0,0};
const int dy[4] = {0,0,1,-1};
char s[mx][mx];
char t[mx*mx];
int n,m;
deque <int> deq;
int dir(char ch)
{
	if (ch=='W') return 1;
	if (ch=='S') return 0;
	if (ch=='A') return 3;
	return 2;
}
bool out(pa now)
{
	return now.x < 0 || now.y < 0 || now.x == n || now.y == m;
}
int main()
{   
	scanf("%d%d",&n,&m);
	pa now;
	for (int i=0;i<n;i++) {
		scanf("%s",s[i]);
		for (int j=0;j<m;j++) {
			if (s[i][j]=='@')
				now = pa(i,j);
		}
	}
	s[now.x][now.y] = '.';
	scanf("%s",t);
	for (int i=0;t[i];i++) {
		int d = dir(t[i]);
		pa nxt = pa(now.x+dx[d],now.y+dy[d]);
		if (out(nxt)) return 0*puts("GG");
		if (s[nxt.x][nxt.y]=='o') {
			s[nxt.x][nxt.y] = '.';
			deq.push_front(d);
		} else {
			deq.push_front(d);
			deq.pop_back();
		}
		now = nxt;
	}
	s[now.x][now.y] = '@';
	//cout << now.x << " " << now.y << endl;
	while (!deq.empty()) {
		int d = deq.front();
		deq.pop_front();
		pa nxt = pa(now.x+dx[d^1],now.y+dy[d^1]);
		if (s[nxt.x][nxt.y] == '.')
			s[nxt.x][nxt.y] = 'X';
		now = nxt;
	}
	for (int i=0;i<n;i++)
		puts(s[i]);
    return 0;
}

C.「佛御石之钵 -不碎的意志-」

1.只保留值是0的点,更新的时候也只更新这些点

2.维护一每行值是0的点

3.用并查集记录一下转态

步骤2用set会T,所以又得用并查集来维护0值的点

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
typedef pair <int,int> pa;
const int mx = 1e3 + 10;
const int mod = 1e9 + 7;
const int dx[4] = {1,-1,0,0};
const int dy[4] = {0,0,1,-1};
char s[mx][mx];
int st[mx][mx];
int fa[mx*mx],ans;
int w[mx][mx];
int find(int x,int *f)
{
	return x==f[x]?x:f[x]=find(f[x],f);
}
inline void merge(int u,int v,int *f)
{
	//cout << 1 << endl;
	int fu = find(u,f);
	int fv = find(v,f);
	if (fu != fv) {
		if (f == fa)
			ans--;
		f[fv] = fu;
	}
}
int main()
{  
	int n,m,q;
	scanf("%d%d",&n,&m);
	ans = 0;
	for (int i=1;i<=n;i++) {
		scanf("%s",s[i]+1);
		for (int j=1;j<=m;j++) {
			w[i][j] = (i-1)*mx + j;
			fa[w[i][j]] = w[i][j];
			if (s[i][j]=='1') {
				ans++;
				if (s[i-1][j]=='1') 
					merge(w[i-1][j],w[i][j],fa);
				if (s[i][j-1]=='1') 
					merge(w[i][j-1],w[i][j],fa);
			}
		}
	} 
	for (int i=1;i<=n;i++) {
		st[i][m+1] = m+1;
		for (int j=m;j>=1;j--){
			st[i][j] = j;
			if (s[i][j]=='1') merge(j+1,j,st[i]);
		}
	}
	//cout << ans << endl;
	scanf("%d",&q);
	while (q--) {
		int x1,x2,y1,y2;
		scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
		for (int i=x1;i<=x2;i++) {
			int tmp = y1;
			while(1) {
				tmp = find(tmp,st[i]);
				if (tmp > y2) break;
				int id = w[i][tmp];
				ans++;
				if (s[i-1][tmp]=='1') 
					merge(w[i-1][tmp],id,fa);
				if (s[i][tmp-1]=='1') 
					merge(w[i][tmp-1],id,fa);
				if (s[i+1][tmp]=='1')
					merge(w[i+1][tmp],id,fa);
				if (s[i][tmp+1]=='1')
					merge(w[i][tmp+1],id,fa);	
					
				s[i][tmp] = '1';
				merge(tmp+1,tmp,st[i]);
				tmp++;
			}
		}
		printf("%d\n",ans);
	}
    return 0;
}

D.「火鼠的皮衣 -不焦躁的内心-」


Comet OJ - Contest #13[A-D]_#include

变为

Comet OJ - Contest #13[A-D]_#define_02

,那么原式就会变为一个二项式,即为

Comet OJ - Contest #13[A-D]_#include_03

,最后结果即为

Comet OJ - Contest #13[A-D]_#include_04

,由原式可得我们需要的是没有根号a部分的项的和,即为x,所以用一个快速幂求一下上面这个式子,然后输出x即可。

#include<bits/stdc++.h>
using namespace std;
const int maxn = 4e5+5;
typedef long long ll;
ll n,a,b,p;
struct node
{
	__int128 x,y;
	node operator * (node A) {
		node now = {(x*A.x+y*A.y%p*a)%p,(x*A.y+y*A.x)%p};
		return now;
	}
};
node qpow(ll c) {
	node ans = {1,0};
	node base = {b,1};
	while (c) {
		if (c&1) ans = ans*base;
		c >>= 1;
		base = base*base;
	}
	return ans;
}
void print(__int128 v) {
	if (v>9) print(v/10);
	putchar(v%10+'0'); 
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		scanf("%lld%lld%lld%lld",&n,&a,&b,&p);
		node ans = qpow(n);
		print(ans.x);puts("");
	}
	return 0;
}

 

标签:tmp,13,return,OJ,int,ans,Comet,mx,const
From: https://blog.51cto.com/u_12468613/6384500

相关文章

  • Comet OJ - Contest #3 A-D
    题目链接:https://www.cometoj.com/contest/38/problems A.比赛暴力枚举+排序#include<bits/stdc++.h>usingnamespacestd;typedeflonglongll;typedefunsignedlonglongull;constintmx=500+10;intn,m,a[mx];llb[mx*mx];intmain(){ intsiz=0; scanf(......
  • 1341. 电影评分
    【题目】表:Movies+---------------+---------+|ColumnName|Type|+---------------+---------+|movie_id|int||title|varchar|+---------------+---------+movie_id是这个表的主键。title是电影的名字。表:Users+---------------+---------......
  • Flask013_宏和 import 语句
    宏 forms.html1{%macroinput(name,value="",type="text")%}2<inputtype="{{type}}"value="{{value|escape}}"name="{{name}}">3{%endmacro%}45{%macrotextarea(name,value="&q......
  • git (本地仓库)和(远程仓库)之间的代码推送:013
    这里先说明一下循序:1.创建(远程仓库)和(本地仓库)2.创建(远程仓库)和(本地仓库)之间的链接3.将(本地仓库)的代码推通过命令送到(远程仓库);将(本地仓库)的代码通过(TortoiseGit小乌龟)推送到(远程仓库)   1.创建(远程仓库)和(本地仓库),我这里已经创建好了  2.创建(远程仓库)和(本地仓......
  • POJ1714 - The Cave
    首先,我们需要读懂这个图是什么图。第一,忽略外面的环,由“任意两点可到达且路径唯一”的条件可知这是一棵树。第二,因为每个点的度数是三,所以如果只考虑中间的树,除了\(k\)以内的点都是叶子,其他的点度数都是三。考虑什么样的树有很多点度数是三:完全二叉树。但是这个和完全二叉树......
  • Pie(poj 3122)
    MybirthdayiscomingupandtraditionallyI’mservingpie.Notjustonepie,no,IhaveanumberNofthem,ofvarioustastesandofvarioussizes.Fofmyfriendsarecomingtomypartyandeachofthemgetsapieceofpie.Thisshouldbeonepieceofo......
  • CMU_15_445_project_1_buffer_pool
    CMU_15_445_project_1_buffer_poolOverview实现一个基于磁盘的存储管理器,其中包括一个缓冲池。缓冲池是数据库管理器在主存中分配的一块区域,用于缓存从磁盘读取的表和索引数据。缓冲池可以让数据库支持比可用内存大的数据,并且对其他系统部分是透明的。缓冲池可以减少数据库文件......
  • 算法学习day34贪心part03-1005、134、135
    packageLeetCode.greedypart03;/***1005.K次取反后最大化的数组和*给你一个整数数组nums和一个整数k,按以下方法修改该数组:*选择某个下标i并将nums[i]替换为-nums[i]。*重复这个过程恰好k次。可以多次选择同一个下标i。*以这种方式修改数组后,返回......
  • 每周一记13
    什么是 Embedding?你可能在 Twitter 上已经看到这个词被无数次提及。简单来说,Embedding 就是一个多维向量数组,由系列数字组成。它们能够代表任何东西,比如文本、音乐、视频等等。我们这里将主要关注文本。图片创建 Embedding 的过程非常简单。这主要依靠 Embedding 模型(例如......
  • CF1398E Two Types of Spells 题解 set
    题目链接:https://codeforces.com/problemset/problem/1398/E题目大意你有一个集合,初始为空。有两种类型的元素,一种是普通元素,一种是强化元素,两种元素都有一个数值。有\(n\)次操作,每次操作会往集合中加入一个元素或者删除一个元素。每次操作后,你都需要确定集合中元素的一个......