CF617E XOR and Favorite Number

思路

重题

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#define int long long
using namespace std;
int n,m,k,a[100100],belong[100100],sz,num,L,R,ans[100100],barrel[2001000],sum=0;
struct Query{
    int l,r,id;
    bool operator < (const Query &b){
        return (belong[l]==belong[b.l])?r<b.r:belong[l]<belong[b.l];
    }
}Q[100100];
void init(void){
    sz=sqrt(n);
    num=n/sz;
    if(n%sz)
        num++;
    for(int i=1;i<=n;i++)
        belong[i]=i/sz+1;
}
void moveL(int opt){
    if(opt==1){
        barrel[a[L]]--;
        sum-=barrel[k^a[L]];
        L++;
    }
    else{
        L--;
        sum+=barrel[k^a[L]];
        barrel[a[L]]++;
    }
}
void moveR(int opt){
    if(opt==1){
        R++;
        sum+=barrel[k^a[R]];
        barrel[a[R]]++;
    }
    else{
        barrel[a[R]]--;
        sum-=barrel[k^a[R]];
        R--;
    }
}
 signed main(){
    scanf("%lld %lld %lld",&n,&m,&k);
    for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]),a[i]^=a[i-1];
    init();
    for(int i=1;i<=m;i++){
        scanf("%lld %lld",&Q[i].l,&Q[i].r);
        Q[i].l--;
        Q[i].id=i;
    }
    sort(Q+1,Q+m+1);
    L=1;
    R=0;
    sum=0;
    for(int i=1;i<=m;i++){
        while(L<Q[i].l)
            moveL(1);
        while(L>Q[i].l)
            moveL(-1);
        while(R<Q[i].r)
            moveR(1);
        while(R>Q[i].r)
            moveR(-1);
        ans[Q[i].id]=sum;
    }
    for(int i=1;i<=m;i++)
        printf("%lld\n",ans[i]);
    return 0;
}
posted @ 2019-05-06 16:09  dreagonm  阅读(178)  评论(0编辑  收藏  举报