【数据范围】
对于100%的数据,1 ≤ n ≤ 10^6,c ≤ n,m ≤10^6。
解题思路
思路和上一题HH的项链差不多,只需改很少的几个地方就可以AC了。
#include<cstdio> #include<algorithm> #define lowbit(x) (x)&(-x) int n,m,mx; int a[1000010]={0},next[1000010]={0}; int p[1000010]={0};//每种颜色出现的位置 int c[1000010]={0}; int query(int pos) { int ans=0; while(pos) { ans+=c[pos]; pos-=lowbit(pos); } return ans; } void add(int pos,int x) { while(pos<=n) { c[pos]+=x; pos+=lowbit(pos); } } struct Ask{ int l,r,id,ans; }ask[200010]; bool cmp1(const Ask & a,const Ask & b) { return a.l==b.l?a.r<b.r:a.l<b.l; } bool cmp2(const Ask & a,const Ask & b) { return a.id<b.id; } int main() { scanf("%d%d%d",&n,&mx,&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<=mx;i++) if(next[p[i]])add(next[p[i]],1); for(int i=1,l,r;i<=m;i++) { scanf("%d%d",&l,&r); ask[i]={l,r,i,0}; } std::stable_sort(ask+1,ask+1+m,cmp1); for(int i=1,ll=0;i<=m;i++) { while(ll<ask[i].l) { if(next[ll]) add(next[ll],-1); if(next[next[ll]]) add(next[next[ll]],1); ll++; } ask[i].ans=query(ask[i].r)-query(ask[i].l-1); } std::stable_sort(ask+1,ask+1+m,cmp2); for(int i=1;i<=m;i++) printf("%d\n",ask[i].ans); return 0; }