【bzoj2743】[HEOI2012]采花
树状数组
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; #define N 1000010 #define lowbit(x) (x & (-x)) int n,c,m; int t[N],next[N],ans[N],p[N],a[N]; struct Node { int l,r,id; }q[N]; int cmp(Node a,Node b) { return a.l<b.l; } void update(int x,int d) { while (x<=n) t[x]+=d,x+=lowbit(x); } int ask(int x) { int res(0); while (x>0) res+=t[x],x-=lowbit(x); return res; } int main() { scanf("%d%d%d",&n,&c,&m); for (int i=1;i<=n;i++) scanf("%d",&a[i]); for (int i=n;i>0;i--) next[i]=p[a[i]],p[a[i]]=i; for (int i=1;i<=c;i++) if (next[p[i]]) update(next[p[i]],1); for (int i=1;i<=m;i++) scanf("%d%d",&q[i].l,&q[i].r),q[i].id=i; sort(q+1,q+m+1,cmp); int l=1; for (int i=1;i<=m;i++) { while (l<q[i].l) { if (next[l]) update(next[l],-1); if (next[next[l]]) update(next[next[l]],1); l++; } ans[q[i].id]=ask(q[i].r)-ask(q[i].l-1); } for(int i=1;i<=m;i++) printf("%d\n",ans[i]); return 0; }