求证明该做法,或证伪,玄2关
查看原帖
求证明该做法,或证伪,玄2关
705296
miffy_123楼主2024/12/17 16:02

前言:打比赛时想到这个解法,但不知道正确不正确,看起来挺真的,可是50pts。

思路:容易发现,在左端点固定的情况下,右端点越右越不可能,所以具有单调性。然后就想到二分或双指针,二分不太可行,所以双指针,然而我们可以记录两个值,一个是这个数的个数,一个数是这个数^x的个数,然后就可以搞了,但50pts。

代码:

#include <bits/stdc++.h>
#define int long long
#define rep(i,l,r) for(int i=l;i<=r;++i)
#define per(i,r,l) for(int i=r;i>=l;--i)
using namespace std;
const int N=1e5+5;
int n,m,x;
int a[N],b[N],check[N];
map<int,int>mp;
map<int,int>mp2;
signed main(){
    cin>>n>>m>>x;
    rep(i,1,n){
        cin>>a[i];
        b[i]=a[i]^x;
    }
    int cnt=0,l=1,r=1;
    while(r<=n||l<=n){
        if(r<l)mp.clear(),mp2.clear(),cnt=0;
        r=max(l,r);
        while(r<=n&&cnt<=0){
            cnt+=mp[b[r]];
            mp[a[r]]++;
            mp2[b[r]]++;
            if(cnt>0)break;
            ++r;
        }
        check[l]=r;
        cnt-=mp2[a[l]];
        mp[a[l]]--;
        mp2[b[l]]--;
        ++l;
    }
    rep(i,1,m){
        int l,r;
        cin>>l>>r;
        if(r>=check[l]){
            cout<<"yes"<<endl;
        }
        else{
            cout<<"no"<<endl;
        }
    }
    return 0;
}
2024/12/17 16:02
加载中...