CF1511G Chips on a Board

逐位思考的好题目。

#include<cstdio>
const int H=10000010;
char G[H],*_=G;
int read(){
	int x=0;
	while(*_<'0'||'9'<*_)_++;
	while('0'<=*_&&*_<='9')x=x*10+(*_++^'0');
	return x;
}
const int N=200020,M=20;
int sum[N],lg[N],st[M][N];
char A[N],*O=A;
int main(){
	fread(G,1,H,stdin);
	int n=read(),m=read(),i,j,q,l,r,ans;
	for(i=1;i<=n;i++)sum[read()]++;
	for(i=1;i<=m;i++)sum[i]+=sum[i-1];
	for(i=2;i<=m;i++)lg[i]=lg[i>>1]+1;
	for(j=1;j<=lg[m];j++)
		for(i=1;i+(1<<j)-1<=m;i++)
			 st[j][i]=st[j-1][i]^st[j-1][i+(1<<j-1)]^((1<<j-1)*((sum[i+(1<<j)-1]-sum[i+(1<<j-1)-1])&1));
	q=read();
	while(q--){
		l=read(),r=read(),ans=0;
		for(i=lg[m];~i;i--)if(l+(1<<i)<=r){
			ans^=st[i][l],l+=(1<<i);
			if((sum[r]-sum[l-1])&1)ans^=(1<<i);
		}
		ans?*O++='A':*O++='B';
	}
	fwrite(A,1,O-A,stdout);
	return 0;
} 
posted @ 2022-07-29 19:30  Qzong  阅读(19)  评论(0编辑  收藏  举报