【BZOJ】2743: [HEOI2012]采花(树状数组)
题目
传送门:QWQ
分析
已经凉凉。看错数据范围敲了发莫队........
和HH的项链差不多,把每种颜色之前的颜色到再之前的颜色这段区间 区间加。
区间加就树状数组特技
代码
#include <bits/stdc++.h> const int maxn=2e6+10; using namespace std; struct data{ int num,l,r; }Q[maxn]; int c[maxn],ans[maxn],pre[maxn],front[maxn],bit[maxn]; int n,m,o; bool cmp(data a,data b){ return a.r<b.r; } void add(int x,int a){if(!x)return; for(;x<=n;x+=x&-x) bit[x]+=a; } int sum(int x){int ans=0; for(;x>0;x-=x&-x) ans+=bit[x]; return ans;} int main(){ scanf("%d%d%d",&n,&o,&m); for(int i=1;i<=n;i++) scanf("%d",&c[i]); for(int i=1;i<=m;i++){ scanf("%d%d",&Q[i].l,&Q[i].r); Q[i].num=i; } sort(Q+1,Q+1+m,cmp); int now=1; for(int i=1;i<=m;i++){ pre[i]=front[c[i]]; front[c[i]]=i; add(pre[pre[i]],-1); add(pre[i],1); while(Q[now].r==i) ans[Q[now].num]=sum(i)-sum(Q[now].l-1),now++; } for(int i=1;i<=m;i++){ printf("%d\n",ans[i]); } return 0; }