首页 技术 正文
技术 2022年11月12日
0 收藏 480 点赞 4,439 浏览 938 个字

正题

题目链接:https://www.luogu.com.cn/problem/CF1511G


题目大意

给出\(n*m\)的棋盘上每一行有一个棋子,双方轮流操作可以把一个棋子向左移动若干步(不能不动),无法操作者输。

\(q\)次询问只留下期盼的\(l\sim r\)列时的胜负情况。


解题思路

右边界就是一个上限很好搞,但是左边界很麻烦,因为相当于让这些数都减去一个值。

因为二进制位下的,所以考虑一下一个类似于\(ST\)表的做法。设\(f_{i,j}\)表示留下\([i,i+2^j-1]\)的棋盘时的异或和。

合并的时候只需要多考虑一下在\([i+2^{j-1},i+2^j-1]\)位置的棋子数是奇数还是偶数就好了,如果是奇数还要多异或一个\(2^{j-1}\)。

然后询问的合并同理。

时间复杂度\(O(n\log n)\)


code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=2e5+10;
int n,m,q,f[N][19],s[N];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++){
int x;scanf("%d",&x);
f[x-1][1]^=1;s[x]^=1;
}
for(int i=1;i<=m;i++)s[i]^=s[i-1];
for(int j=2;(1<<j)<=m;j++)
for(int i=1;i+(1<<j)-1<=m;i++){
f[i][j]=f[i][j-1]^f[i+(1<<j-1)][j-1];
if(s[i+(1<<j)-1]^s[i+(1<<j-1)-1])f[i][j]^=(1<<j-1);
}
scanf("%d",&q);
while(q--){
int l,r,ans=0;
scanf("%d%d",&l,&r);
for(int j=18;j>=0;j--)
if(l+(1<<j)-1<=r){
ans^=f[l][j];l+=(1<<j);
if(s[r]^s[l-1])ans^=(1<<j);
}
if(ans)putchar('A');
else putchar('B');
}
return 0;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:8,992
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,506
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,349
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,134
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,766
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,844