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;
}
posted @ 2025-04-29 08:56  特别之处  阅读(13)  评论(0)    收藏  举报