Codeforces Round #340 (Div. 2) E XOR and Favorite Number 莫队板子

#include<bits/stdc++.h>
using namespace std;
const int N=1<<20;
struct node{
    int l,r;
    int id;
}q[N];
int pos[N];
long long ans[N];
//每个前缀值出现的次数 
long long flag[N];
int a[N];
bool cmp(node a,node b)
{
    //如果左端点在同一块中,按右端点排序 
    if(pos[a.l]==pos[b.l])
        return a.r<b.r;
    //否则,按照块来排序 
    return pos[a.l]<pos[b.l];
}
int n,m,k;
int l=1,r=0;
long long Ans=0;
void add(int x)
{
    //当前 前缀和出现的次数-- 
    Ans+=flag[a[x]^k];
    flag[a[x]]++;
} 
void del(int x)
{
    //当前 前缀和出现的次数-- 
    flag[a[x]]--;
    //总的减去 
    Ans-=flag[a[x]^k];
}
int main()
{
    cin>>n>>m>>k;
    int sz=sqrt(n);
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        //处理前缀和 
        a[i]=a[i]^a[i-1];
        //分块 
        pos[i]=i/sz;
    }
    for(int i=1;i<=m;i++)
    {
        cin>>q[i].l>>q[i].r;
        q[i].id=i;
    }
    sort(q+1,q+1+m,cmp);
    flag[0]=1;
    for(int i=1;i<=m;i++)
    {
        while(l<q[i].l)
        {
            del(l-1);
            l++;
        }
        while(l>q[i].l)
        {
            l--;
            add(l-1);
        }
        while(r<q[i].r)
        {
            r++;
            add(r);
        }
        while(r>q[i].r)
        {
            del(r);
            r--;
        }
        ans[q[i].id]=Ans;
    }
    for(int i=1;i<=m;i++)
        cout<<ans[i]<<endl;
    return 0;
}
原文地址:https://www.cnblogs.com/QingyuYYYYY/p/12348781.html