题目描述
题解
标程
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 100005
typedef long long ll;
using namespace std;
ll arr[maxn],ans[maxn],pre[maxn],sum[maxn];
ll now=0,cnt1[maxn],cnt2[maxn];
int n,m,block=0;
struct query
{
int l, r, ind;
bool operator < (const query &b)const
{
if(l/block == b.l/block)return r < b.r;
return l/block < b.l/block;
}
}qrr[maxn];
void ins1(int i)
{
cnt1[0^pre[i]]++;
cnt2[0^pre[i-1]]++;
now+=cnt2[pre[i]];
}
void remov1(int i)
{
now-=cnt2[pre[i]];
cnt1[0^pre[i]]--;
cnt2[0^pre[i-1]]--;
}
void ins2(int i)
{
cnt1[0^pre[i]]++;
cnt2[0^pre[i-1]]++;
now+=cnt1[pre[i-1]];
}
void remov2(int i)
{
now-=cnt1[pre[i-1]];
cnt1[0^pre[i]]--;
cnt2[0^pre[i-1]]--;
}
int main()
{
scanf("%d%d",&n,&m);
block=(int)sqrt(n);
for(int i=1;i<=n;i++)
{
scanf("%lld",&arr[i]);
pre[i]=pre[i-1]^arr[i];
}
for(int i=1;i<=m;i++)
{
qrr[i].ind=i;
scanf("%d%d",&qrr[i].l,&qrr[i].r);
qrr[i].l++;
}
sort(qrr+1,qrr+1+m);
int l=1,r=1;
ins1(1);
for(int i=1;i<=m;i++)
{
while(l<qrr[i].l) remov2(l++);
while(l>qrr[i].l) ins2(--l);
while(r<qrr[i].r) ins1(++r);
while(r>qrr[i].r) remov1(r--);
ans[qrr[i].ind]=now;
}
for(int i=1;i<=m;i++) printf("%lld\n",ans[i]);
return 0;
}
其实莫队挺好van的