参考题解:https://www.luogu.org/blog/skylee/solution-p1972
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include<iostream> #include<algorithm> using namespace std; int n,m; int arr[500005]; int c[500000]; int last[1000001]; int flag=0; struct question{ int id,l,r,ans; bool operator < (const question& q2) const{ if(flag==0)return r<q2.r; else return id<q2.id; } }qs[200005]; inline int lowbit(int i){ return i&(-i); } int query(int x){ int sum=0; while(x>0){ sum+=c[x]; x-=lowbit(x); } return sum; } void update(int i,int v){ while(i<=n){ c[i]+=v; i+=lowbit(i); } } int main(){ ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++){ cin>>arr[i]; } cin>>m; for(int i=1;i<=m;i++){ cin>>qs[i].l>>qs[i].r; qs[i].id=i; } sort(qs+1,qs+m+1); int ptr=1; for(int i=1;i<=m;i++){ for(;ptr<=qs[i].r;ptr++){ if(last[arr[ptr]]!=0)update(last[arr[ptr]],-1); update(last[arr[ptr]]=ptr,1); } qs[i].ans=query(qs[i].r)-query(qs[i].l-1); } flag=1; sort(qs+1,qs+m+1); for(int i=1;i<=m;i++){ cout<<qs[i].ans<<endl; } } |