P1972 [SDOI2009]HH的项链
树状数组模板题
就是求一个区间值
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,pre[1234567],tot,r;
int a[1234567],ans[1234567],sum[1234567];
struct node {
int l,r,id;
} q[1234567];
bool cmd(node a,node b){
return a.r<b.r;
}
int lowbit(int x) {
return x&(-x);
}
void updata(int x,int d) {
while(x<=n) {
sum[x]+=d;
x=x+lowbit(x);
}
}
int getsum(int x) {
int res=0;
while(x>0) {
res+=sum[x];
x=x-lowbit(x);
}
return res;
}
int main() {
scanf("%d",&n);
for(int i=1; i<=n; i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=0; i<m; i++) {
scanf("%d%d",&q[i].l,&q[i].r);
q[i].id=i;
}
sort(q,q+m,cmd);
r=1;
for(int i=0; i<m; i++) {
while(r<=q[i].r) {
if(pre[a[r]]!=0)
updata(pre[a[r]],-1);
pre[a[r]]=r;
updata(r,1);
r++;
}
ans[q[i].id]=getsum(q[i].r)-getsum(q[i].l-1);//DON'T FORGET!!
}
for(int i=0; i<m; i++) printf("%d\n",ans[i]);
return 0;
}