牛客网多校比赛第一场 J-Diffient(树状数组或者莫队算法)

https://www.nowcoder.com/acm/contest/139/J

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+500;
typedef struct node{
    int l,r,No;
}node;
int cmp(node a, node b){
    return (a.r==b.r&&a.l<b.l)||a.r<b.r;
}
node q[N];
int n,m,k,tmp,c[N],a[N],vis[N],ans[N];
int lowbit(int x){return x&(-x);}
void update(int x,int val=1){for(;x<=2*n;c[x]+=val,x+=lowbit(x));}
int getsum(int x){ int ret=0;for(;x>0;ret+=c[x],x-=lowbit(x));return ret;}
int main()
{
    while(~scanf("%d%d",&n,&m)){
        memset(q,0,sizeof(q));
        memset(c,0,sizeof(c));
        memset(vis,0,sizeof(vis));
        memset(ans,0,sizeof(ans));
        for(int i=1;i<=n;i++){scanf("%d",&a[i]);a[n+i]=a[i];}
        for(int i=1;i<=m;i++){
            scanf("%d%d",&q[i].l,&q[i].r);q[i].No=i;
            tmp=q[i].r;q[i].r=q[i].l+n;q[i].l=tmp;
        }
        sort(q+1, q+1+m,cmp);
        int L=1;

        for(int i=1;i<=m;i++){
            for(int j=L;j<=q[i].r;j++){
                if(vis[a[j]]){
                    update(vis[a[j]],-1);
                }
                update(j,1);
                vis[a[j]]=j;
            }
            L=q[i].r+1;
            ans[q[i].No]=getsum(q[i].r)-getsum(q[i].l-1);
        }
        for(int i=1;i<=m;i++){
            printf("%d\n",ans[i]);
        }
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/Z_sea/article/details/81396662