CF--832--D

关键

这美妙的模拟,我写的和屎一样,写了一个小时,都没出来
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;
}
posted @ 2022-12-28 22:44  basicecho  阅读(27)  评论(0)    收藏  举报