SPOJ 3267 DQUERY - D-query(莫队)

给出 n 个数,及 m 个区间,问区间内每个数 a[i] ~ a[j] 中有几个不同的数 

const int N=1e6+5;
 
    int n,m,t;
    int i,j,k;
    int a[N];
    int block,belong[N];
    int ans[N],now=0;
    int cnt[N];

struct node
{
    int l,r;
    int id;
}q[N];
bool cmp(node a,node b)
{
    return belong[a.l]==belong[b.l]?a.r<b.r:belong[a.l]<belong[b.l];
}

void add(int x)
{
    if(cnt[a[x]]==0) now++;
    cnt[a[x]]++;
}
void del(int x)
{
    cnt[a[x]]--;
    if(cnt[a[x]]==0) now--;
}
int main()
{
    //IOS;
    while(sd(n)==1){
        for(i=1;i<=n;i++) sd(a[i]);
        block=sqrt(n);
        int num=ceil(double(n/block));
        for(i=1;i<=num;i++){
            for(j=(i-1)*block+1;j<=i*block;j++){
                belong[j]=i;
            }
        }
        sd(m);
        for(i=1;i<=m;i++) sdd(q[i].l,q[i].r),q[i].id=i;
        sort(q+1,q+1+m,cmp);
        int l=1,r=0;
        for(i=1;i<=m;i++){
            while(l<q[i].l) del(l++);
            while(l>q[i].l) add(--l);
            while(r<q[i].r) add(++r);
            while(r>q[i].r) del(r--);
            ans[q[i].id]=now;
        }
        for(i=1;i<=m;i++) pd(ans[i]);
    }
    //PAUSE;
}

 

 

猜你喜欢

转载自blog.csdn.net/C_Dreamy/article/details/107722955