http://begin.lydsy.com/JudgeOnline/problem.php?id=2190&csrf=4ffbd377695c4983c148dffbc3530278
询问区间出现正偶数次数的数的个数。
可以离线或在线。
我选择离线上莫队!
同样将普通莫队的修改操作改一改即可。
#include <bits/stdc++.h>
using namespace std;
int n,a[100010],m,p;
int L=1,R=0,bl;
struct node {
int l,r,num;
} q[100010];
bool cmp(node a,node b) {
return (a.l/bl)==(b.l/bl)?a.r<b.r:(a.l/bl)<(b.l/bl);
}
int cnt[100010],sum;
void add(int x) {
cnt[x]++;
if(cnt[x]%2==0&&cnt[x]>0)
sum++;
else if(cnt[x]!=1)
sum--;
}
void del(int x) {
cnt[x]--;
if(cnt[x]%2==0&&cnt[x]>0)
sum++;
else if(cnt[x]!=0)
sum--;
}//修改操作的小修改
int ans[200010];
int main() {
scanf("%d %*d %d",&n,&m);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
//scanf("%d",&m);
for(int i=1;i<=m;i++)
scanf("%d %d",&q[i].l,&q[i].r),q[i].num=i;
bl=sqrt(n);
//printf("%d
",bl);
sort(q+1,q+m+1,cmp);
for(int i=1;i<=m;i++) {
//printf("now do %d
",q[i].num);
while(R<q[i].r) add(a[++R]);
while(R>q[i].r) del(a[R--]);
while(L<q[i].l) del(a[L++]);
while(L>q[i].l) add(a[--L]);
ans[q[i].num]=sum;
}
for(int i=1;i<=m;i++)
printf("%d
",ans[i]);
return 0;
}