czy的后宫3 题解

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;
}
原文地址:https://www.cnblogs.com/lajiccf/p/12903946.html