CF1747D Yet Another Problem题解
写数据结构的时候看错题目了,误入这道题目了…………(本来要写的叫:Yet Another Range Query Problem)
非常的简单,首先,只有奇数个数才可以进行操作。容易发现如果原本二进制下有偶数个就会变为0个(还是偶数个),如果有奇数个就都会有(还是奇数个),所以不改变个数的大小。
知道以上信息后,我们就知道了\(x\)到\(y\)可以操作成功当且仅当这一段的异或和为0。然后如果这有偶数个数那么我们需要在中间找出一个\(z\)使得\(x~z\)异或和也为0。(这个可以自己想想为什么)
最后分类讨论答案为\(0,1,2,-1\)四种情况即可。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=2e5+10;
map<int,int>vis[2];
int n,Q,a[maxn],val[maxn],lst[maxn],x,y,ling[maxn];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>Q;
for(int i=1;i<=n;i++){
cin>>a[i];
val[i]=val[i-1]^a[i];
lst[i]=vis[(i&1)^1][val[i]];
if(!a[i]&&!a[i-1]){
ling[i]=ling[i-1];
}
else if(!a[i]){
ling[i]=i;
}
else{
ling[i]=n+1;
}
vis[i&1][val[i]]=i;
}
while(Q--){
cin>>x>>y;
if(val[x-1]!=val[y]||((y-x)%2==1&&lst[y]<x)){
cout<<-1<<'\n';
}
else if(ling[y]<=x){
cout<<0<<'\n';
}
else if((y-x)%2==0||!a[x]||!a[y]){
cout<<1<<'\n';
}
else{
cout<<2<<'\n';
}
}
return 0;
}
浙公网安备 33010602011771号