ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1511G Chips on a Board

2022-06-16 22:01:53  阅读:187  来源: 互联网

标签:Board int ll db long CF1511G 倍增 Chips define


题面传送门
显然根据nim游戏,要求的是一个类似于$\operatorname{xor}{a_i-l[l\leq a_i\leq r]} $
容易想到想美味那道题一样按位处理平移问题,如果这样你就成功被带偏了
考虑倍增,实际上倍增有一个很美妙的性质就是倍增每次增加的\(2^i\)是绝对大于这个增加的区间中的数的,也就是说这里的加\(2^i\)相当于异或上\(2^i\)。
又因为众所周知的,异或具有交换律,所以可以直接倍增维护即可。
时间复杂度\(O(n\log n)\),不得不说是真的很优美。

#include<bits/stdc++.h>
#define I inline
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
#define abs(x) ((x)>0?(x):-(x))
#define ll long long
#define db double
#define lb long db
#define N (200000+5)
#define M (10+5)
#define K (3000000+5)
#define mod 1000000007
#define Mod (mod-1)
#define eps (1e-9)
#define ull unsigned ll
#define it iterator
#define Gc() getchar() 
#define Me(x,y) memset(x,y,sizeof(x))
#define Mc(x,y) memcpy(x,y,sizeof(x))
#define d(x,y) (n*(x-1)+(y))
#define R(n) (1ll*rand()*rand()%(n)+1)
#define Pc(x) putchar(x)
#define LB lower_bound
#define UB upper_bound
#define PB push_back
using namespace std;
int n,m,x,y,z,Ans,k,F[N][20],G[N][20];
int main(){
	freopen("1.in","r",stdin);
	int i,j;scanf("%d%d",&n,&m);for(i=1;i<=n;i++) scanf("%d",&x),G[x][0]^=1;
	for(i=m;i;i--){
		for(j=1;i+(1<<j)-1<=m;j++) G[i][j]=G[i][j-1]+G[i+(1<<j-1)][j-1],F[i][j]=F[i][j-1]^F[i+(1<<j-1)][j-1]^(G[i+(1<<j-1)][j-1]&1?(1<<j-1):0);
	}scanf("%d",&k);while(k--){Ans=0;scanf("%d%d",&x,&y);z=x;for(i=19;~i;i--) x+(1<<i)<=y+1&&(Ans=Ans^F[x][i]^(G[x][i]&1?x-z:0),x+=(1<<i));Pc(Ans?'A':'B');}
} 

标签:Board,int,ll,db,long,CF1511G,倍增,Chips,define
来源: https://www.cnblogs.com/275307894a/p/16383702.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有