ACWING.2492 HH 的项链

ACWING.2492 HH 的项链

HH 有一串由各种漂亮的贝壳组成的项链。

HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义。

HH 不断地收集新的贝壳,因此他的项链变得越来越长。

有一天,他突然提出了一个问题:某一段贝壳中,包含了多少种不同的贝壳?

思路

莫队模板

代码

#include <bits/stdc++.h>
using namespace std;
const int N=200010,M=1000010;
int w[N],cnt[M],ans[N];
struct Q{
    int id,l,r;
}q[N];
int len;
int get(int x){
    return x/len;
}
bool cmp(const Q &a,const Q &b){
    int i=get(a.l),j=get(b.l);
    if(i==j){
        return a.r<b.r;
    }
    else {
        return i<j;
    }
}
void add(int x,int &res){
    if(!cnt[x]) res++;
    cnt[x]++;
}
void del(int x,int &res){
    cnt[x]--;
    if(!cnt[x]) res--;
}

int main(){
    int n; scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",w+i);
    }
    int m; scanf("%d",&m);
    len=sqrt((double)n*n/m); 
    for(int i=0;i<m;i++) {
        scanf("%d",&q[i].l); scanf("%d",&q[i].r);
        q[i].id=i;
    }
    sort(q,q+m,cmp);
    for(int k=0,i=0,j=1,res=0;k<m;k++){
        int id=q[k].id,l=q[k].l,r=q[k].r;
        while(i<r) add(w[++i],res);
        while(i>r) del(w[i--],res);
        while(j>l) add(w[--j],res);
        while(j<l) del(w[j++],res);
        ans[id]=res;
    }
    for(int i=0;i<m;i++) cout<<ans[i]<<endl;
    return 0;
}
posted @ 2021-02-01 22:43  ans20xx  阅读(44)  评论(0)    收藏  举报