AtCoder Regular Contest 205 (Div. 2)

A - 2x2 Erasing

按从上到下从左到右的顺序将每一个合法 \(2\times 2\) 矩形的左上角涂黑是合法的,二维前缀和维护即可。

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int N=505;
int n,q,a[N][N];
char s[N][N];
void slv(int _csid,int _csi){
	scanf("%d %d",&n,&q);
	rep(i,1,n)scanf("%s",s[i]+1);
	rep(i,1,n-1)rep(j,1,n-1){
		if(s[i][j]=='.'&&s[i+1][j]=='.'&&s[i][j+1]=='.'&&s[i+1][j+1]=='.')a[i][j]=1;
		a[i][j]+=a[i-1][j]+a[i][j-1]-a[i-1][j-1];
	}
	rep(_,1,q){
		int xl,xr,yl,yr;
		scanf("%d %d %d %d",&xl,&xr,&yl,&yr);
		xr--,yr--;
		printf("%d\n",a[xr][yr]-a[xl-1][yr]-a[xr][yl-1]+a[xl-1][yl-1]);
	}
}
void main(){
	// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T=1,csid=-1;
	// scanf("%d",&csid);
	// scanf("%d",&T);
	// scanf("%d",&csid);
	rep(i,1,T)slv(csid,i);
}
}
int main(){
	string __name="";
	if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
	ax_by_c::main();
	return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/

B - Triangle Toggle

容易发现每个点连出的白边个数的奇偶性不变,将奇数两两配对即可使白边最少即黑边最多。

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int N=2e5+5;
int n,m,a[N];
void slv(int _csid,int _csi){
	scanf("%d %d",&n,&m);
	rep(i,1,m){int x,y;scanf("%d %d",&x,&y),a[x]^=1,a[y]^=1;}
	int cnt=0;rep(i,1,n)if(a[i])cnt++;
	if(n%2==1)printf("%lld\n",(ll)n*(n-1)/2-cnt/2);
	else printf("%lld\n",(ll)n*(n-1)/2-(n-cnt)/2);
}
void main(){
	// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T=1,csid=-1;
	// scanf("%d",&csid);
	// scanf("%d",&T);
	// scanf("%d",&csid);
	rep(i,1,T)slv(csid,i);
}
}
int main(){
	string __name="";
	if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
	ax_by_c::main();
	return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/

C - No Collision Moves

若有包含关系或相交且反向的则无解,否则只可能是相邻的有限制,用循环可实现拓扑排序。

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int intinf=2e9;
constexpr int N=2e5+5;
int n;
struct node{int s,t,id;}a[N];
bool cmp(node x,node y){return min(x.s,x.t)<min(y.s,y.t);}
bool rem[N];
bool check(int i){
	if(rem[i])return 0;
	if(i!=n&&a[i].s<a[i].t&&a[i+1].s<a[i].t&&!rem[i+1])return 0;
	if(i!=1&&a[i].s>a[i].t&&a[i-1].s>a[i].t&&!rem[i-1])return 0;
	return 1;
}
void slv(int _csid,int _csi){
	scanf("%d",&n);
	rep(i,1,n)scanf("%d %d",&a[i].s,&a[i].t),a[i].id=i;
	sort(a+1,a+1+n,cmp);
	int mnr=intinf;
	per(i,n,1){
		if(mnr<max(a[i].s,a[i].t))return (void)(puts("No"));
		mnr=min(mnr,max(a[i].s,a[i].t));
	}
	rep(i,1,n-1)if(((a[i].s<a[i].t)^(a[i+1].s<a[i+1].t))&&(max(a[i].s,a[i].t)>min(a[i+1].s,a[i+1].t)))return (void)(puts("No"));
	puts("Yes");
	rep(i,1,n)if(check(i)){
		printf("%d ",a[i].id),rem[i]=1;
		per(j,i-1,1){
			if(!check(j))break;
			printf("%d ",a[j].id),rem[j]=1;
		}
		rep(j,i+1,n){
			if(!check(j))break;
			printf("%d ",a[j].id),rem[j]=1;
		}
	}
}
void main(){
	// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T=1,csid=-1;
	// scanf("%d",&csid);
	// scanf("%d",&T);
	// scanf("%d",&csid);
	rep(i,1,T)slv(csid,i);
}
}
int main(){
	string __name="";
	if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
	ax_by_c::main();
	return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/

D - Non-Ancestor Matching

若没有超过总大小一半的子树则可以将子树中所有点(除了根)全部匹配,否则将其他子树看成一个新子树递归即可,注意新子树中点是可以与新根匹配的,且这样一定是优的。

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr int N=5e5+5;
int n,fa[N],sz[N],ans;
vector<int>g[N];
void dfs(int u){sz[u]=1;for(auto v:g[u])dfs(v),sz[u]+=sz[v];}
void dfs1(int u,int k){
	if(k>=sz[u])return (void)(ans+=(k+sz[u])/2);
	if(k)k--,ans++;
	int sum=k,mx=k;
	for(auto v:g[u])sum+=sz[v],mx=max(mx,sz[v]);
	if(mx*2<=sum)return (void)(ans+=sum/2);
	for(auto v:g[u])if(sz[v]==mx)dfs1(v,sum-sz[v]);
}
void slv(int _csid,int _csi){
	scanf("%d",&n);
	rep(i,1,n)g[i].clr();
	rep(i,2,n)scanf("%d",&fa[i]),g[fa[i]].pb(i);
	dfs(1);
	ans=0,dfs1(1,0);
	printf("%d\n",ans);
}
void main(){
	// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T=1,csid=-1;
	// scanf("%d",&csid);
	scanf("%d",&T);
	// scanf("%d",&csid);
	rep(i,1,T)slv(csid,i);
}
}
int main(){
	string __name="";
	if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
	ax_by_c::main();
	return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/

E - Subset Product Problem

拆高低位,修改时枚举低位的超集,查询时枚举高位的子集即可,时间复杂度 \(O(n\sqrt V)\)

#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=(l),qwp=(r);i<=qwp;i++)
#define per(i,r,l) for(int i=(r),qwp=(l);i>=qwp;i--)
#define repll(i,l,r) for(ll i=(l),qwp=(r);i<=qwp;i++)
#define perll(i,r,l) for(ll i=(r),qwp=(l);i>=qwp;i--)
#define pb push_back
#define ins insert
#define clr clear
#define ers(S,X) (S).erase((S).find((X)))
#define uset unordered_set
#define umap unordered_map
#define mset multiset
using namespace std;
namespace ax_by_c{
typedef unsigned long long ull;
typedef long long ll;
typedef double db;
constexpr ll mod=998244353;
constexpr int N=4e5+5;
constexpr int S=(1<<11)+5;
ll f[S][S];
void upd(int x){
	int p=x>>10,q=x&((1<<10)-1);
	rep(i,0,(1<<10)-1)if((i&q)==q)f[p][i]=f[p][i]*x%mod;
}
ll Q(int x){
	int p=x>>10,q=x&((1<<10)-1);
	ll res=1;
	rep(i,0,(1<<10)-1)if((p&i)==i)res=res*f[i][q]%mod;
	return res;
}
int n,a[N];
void slv(int _csid,int _csi){
	rep(i,0,(1<<10)-1)rep(j,0,(1<<10)-1)f[i][j]=1;
	scanf("%d",&n);
	rep(i,1,n)scanf("%d",&a[i]);
	rep(i,1,n)upd(a[i]),printf("%lld\n",Q(a[i]));
}
void main(){
	// ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int T=1,csid=-1;
	// scanf("%d",&csid);
	// scanf("%d",&T);
	// scanf("%d",&csid);
	rep(i,1,T)slv(csid,i);
}
}
int main(){
	string __name="";
	if(__name!="")freopen((__name+".in").c_str(),"r",stdin),freopen((__name+".out").c_str(),"w",stdout);
	ax_by_c::main();
	return 0;
}
/*
g++ -std=c++14 -O2 -Wall -Wextra "-Wl,--stack=200000000" A.cpp -o A.exe
A.exe
*/
posted @ 2025-09-07 08:26  ax_by_c  阅读(67)  评论(0)    收藏  举报