AtCoder Beginner Contest 420 (abc420) 赛后复盘

我再也不在赛时看瓜条了。。。

QQ20250824-215949

A&B

简单题,直接放代码。

A
#include<bits/stdc++.h>

#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050
int x,y;

void work() {
	cin>>x>>y;
	cout<<(x-1+y)%12+1<<'\n';
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}
B
#include<bits/stdc++.h>

#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050

int n,m;
string s[maxn];
int pt[maxn];

void work() {
	cin>>n>>m;
	For(i,1,n) cin>>s[i],s[i]=" "+s[i];
	For(i,1,m) {
		int x=0,y=0;
		For(j,1,n) if(s[j][i]=='0') x++;else y++;
		if(x!=0&&y!=0) {
			if(x<y) {For(j,1,n) if(s[j][i]=='0') pt[j]++;}
			else {For(j,1,n) if(s[j][i]=='1') pt[j]++;}
		}
	}
	int res=0;
	For(i,1,n) res=max(res,pt[i]);
	For(i,1,n) if(pt[i]==res) cout<<i<<' ';
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}

C

注意到每次修改只会对一位产生影响,所以只用先算出答案,每次操作对当前位置更新计算就好了。

点击查看代码
#include<bits/stdc++.h>

#define int ll
#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050

int n,q;
int a[maxn],b[maxn];

void work() {
	in2(n,q);
	For(i,1,n) in1(a[i]);
	For(i,1,n) in1(b[i]);
	int res=0;
	For(i,1,n) res+=min(a[i],b[i]);
	while(q--) {
		char opt=getchar();
		while(opt!='A'&&opt!='B') opt=getchar();
		int x,y; in2(x,y);
		res-=min(a[x],b[x]);
		if(opt=='A') {
			a[x]=y;
		}
		if(opt=='B') {
			b[x]=y;
		}
		res+=min(a[x],b[x]);
		cout<<res<<'\n';
	}
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}

D

注意到门开关只有两种状态,故 bfs 的时候再多记录一维表示当前状态即可。

点击查看代码
#include<bits/stdc++.h>

#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 505

int vis[maxn][maxn][2];

int h,w;
char ch[maxn][maxn];
int sx,sy;
int dx[5]={0,1,-1,0,0},dy[5]={0,0,0,1,-1};

struct node {
	int a,b,c,d;
};

void work() {
	cin>>h>>w;
	For(i,1,h) For(j,1,w) {
		cin>>ch[i][j];
		if(ch[i][j]=='S') sx=i,sy=j;
	}
	queue<node> q; q.push({sx,sy,0,0});
	vis[sx][sy][0]=1;
	while(!q.empty()) {
		auto [x,y,flg,stp]=q.front(); q.pop();
		if(ch[x][y]=='G') {
			return cout<<stp,void();
		}
		For(i,1,4) {
			int X=x+dx[i],Y=y+dy[i];
			int f=flg^(ch[X][Y]=='?');
			if(X>=1&&X<=h&&Y>=1&&Y<=w&&!vis[X][Y][f]&&ch[X][Y]!='#'&&!(((ch[X][Y]=='o')&&(flg==1))||((ch[X][Y]=='x')&&(flg==0)))) {
				vis[X][Y][f]=1;
				q.push({X,Y,f,stp+1});
			}
		}
	}
	cout<<-1<<'\n';
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
	ios::sync_with_stdio(false); 
	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}

E

注意到一个点能到达的地方可以用并查集来维护,那么同时维护该并查集的黑点个数即可。对于答案即判断该集合黑点数是否为 \(0\) 即可。

点击查看代码
#include<bits/stdc++.h>

#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050
int n,q;

int fa[maxn],siz[maxn],col[maxn];
int fnd(int x) {
	return x==fa[x]?fa[x]:fa[x]=fnd(fa[x]);
}

void work() {
	in2(n,q);
	For(i,1,n) fa[i]=i;
	while(q--) {
		int opt,x,y;
		in2(opt,x);
		if(opt==1) {
			in1(y);
			y=fnd(y);
			x=fnd(x);
			if(x==y) continue;
			fa[y]=x;
			siz[x]+=siz[y];
		} else if(opt==2){
			if(col[x]) siz[fnd(x)]--,col[x]=0;
			else siz[fnd(x)]++,col[x]=1;
		} else {
			cout<<(siz[fnd(x)]>0?"Yes":"No")<<'\n';
		}
	}
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}

G

我们设 \(\sqrt{n^2+n+x}=(n+k)\),那么有 \(n^2+n+x=n^2+2nk+k^2\),即 \(x=k^2+n(2k-1)\),因为 \(-10^{14}\le x \le 10^{14}\),所以 \(|k|\le 10^7\),那么枚举 \(k\) 即可。
由于我的代码实现有一些问题,每个数会被多算一遍,原因未知,因此需要 unique 一下。

点击查看代码
#include<bits/stdc++.h>

#define int i128
#define pii pair<int,int> 
#define pll pair<long long,long long> 
#define ll long long
#define i128 __int128

#define mem(a,b) memset((a),(b),sizeof(a))
#define m0(a) memset((a),0,sizeof(a))
#define m1(a) memset(a,-1,sizeof(a))
#define lb(x) ((x)&-(x))
#define lc(x) ((x)<<1)
#define rc(x) (((x)<<1)|1)
#define pb(G,x) (G).push_back((x))
#define For(a,b,c) for(int a=(b);a<=(c);a++)
#define Rep(a,b,c) for(int a=(b);a>=(c);a--)
#define in1(a) a=read()
#define in2(a,b) a=read(), b=read()
#define in3(a,b,c) a=read(), b=read(), c=read()
#define in4(a,b,c,d) a=read(), b=read(), c=read(), d=read()
#define fst first 
#define scd second 
#define dbg puts("IAKIOI")

using namespace std;

int read() {
	int x=0,f=1; char c=getchar();
	for(;c<'0'||c>'9';c=getchar()) f=(c=='-'?-1:1); 
	for(;c<='9'&&c>='0';c=getchar()) x=(x<<1)+(x<<3)+(c^48);
	return x*f;
}
void write(int x) { if(x<0) {putchar('-'); write(-x); return ;}if(x>=10) write(x/10); putchar('0'+x%10); }

const int mod = 998244353;
int qpo(int a,int b) {int res=1; for(;b;b>>=1,a=(a*a)%mod) if(b&1) res=res*a%mod; return res; }
int inv(int a) {return qpo(a,mod-2); }

#define maxn 200050

int x;
vector<pii> a;
vector<int> ans;
bool flg=0;

void work() {
	in1(x);
	ans.push_back(x-1);
	ans.push_back(-x);
	for(int i=max(min(x-1,-x),(i128)-1e7-100);i<=min(max(x-1,-x),(i128)1e7+100);i++) {
		if(i!=0&&(x-(i*i))%(i+i-1)==0) {
			int n=(x-(i*i))/(i+i-1);
			ans.push_back(n);
		}
	}
	sort(ans.begin(),ans.end());
	int len=unique(ans.begin(),ans.end())-ans.begin();
	cout<<(ll)len<<'\n';
	For(i,0,len-1) cout<<(ll)ans[i]<<' ';
}

signed main() {
//	freopen("data.in","r",stdin);
//	freopen("myans.out","w",stdout);
//	ios::sync_with_stdio(false); 
//	cin.tie(0); cout.tie(0);
	double stt=clock();
	int _=1;
//	_=read();
//	cin>>_;
	For(i,1,_) {
		work();
	}
	cerr<<"\nTotal Time is:"<<(clock()-stt)*1.0/1000<<" second(s)."<<'\n';
	return 0;
}
posted @ 2025-08-24 22:25  coding_goat_qwq  阅读(73)  评论(0)    收藏  举报