关键
这美妙的模拟,我写的和屎一样,写了一个小时,都没出来
1.只需要记录前缀就可以了,不需要适用vector进行二分查找
2.只需要看l或r是否为0就可以了,不需要去二分查找
代码
//只需要判断前缀或者后缀的题目,直接记录就行了,二分查找好麻烦的,模拟了半天也每出来
#include <bits/stdc++.h>
using namespace std;
const int M=2e5+5;
int a[M],s[M];
int pre[M];
int cnt[M];
int main() {
ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
int n,m;
cin>>n>>m;
map<int,int>mp[2];
for(int i=1;i<=n;i++) {
cin>>a[i];
s[i]=s[i-1]^a[i];
cnt[i]=cnt[i-1]+(a[i]!=0);
int x=i%2;
if(mp[x^1].count(s[i]))pre[i]=mp[x^1][s[i]]+1;//记录前缀,也就是上一个区间
mp[x][s[i]]=i;//把这个位置进行更新
}
for(int i=1;i<=m;i++) {
int l,r;
cin>>l>>r;
if(s[r]^s[l-1])cout<<"-1\n";
else if(cnt[r]==cnt[l-1])cout<<"0\n";
else if((r-l+1)%2==1)cout<<"1\n";
else if(a[l]==0||a[r]==0)cout<<"1\n";//对呀,只需要判断那两个位置就可以了,我真是sb
else if(pre[r]>=l)cout<<"2\n";
else cout<<"-1\n";
}
return 0;
}
标签:832,cnt,cout,--,CF,int,mp,前缀
From: https://www.cnblogs.com/basicecho/p/17011459.html