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;
}

浙公网安备 33010602011771号