离线不同数

 1 int s[N],a[N];//离线瞎搞 
 2 int n,q,ans[M];
 3 int nxt[N];
 4 map<int,int >mp;
 5 struct Question{
 6     int l,r,id;
 7     bool operator<(const Question q)const{
 8         return l<q.l;
 9     }
10 }Q[M];
11 void add(int x,int val){
12     for(int i=x;i<=n;i+=lowbit(i)) s[i]+=val;
13 }
14 int query(int x){
15     int ret=0;
16     for(int i=x;i>0;i-=lowbit(i))
17         ret+=s[i];
18     return ret;
19 }
20 int main(){
21     while(scanf("%d",&n)!=EOF){
22         mp.clear();
23         for(int i=1;i<=n;i++){
24             scanf("%d",&a[i]);
25             if(mp.find(a[i])==mp.end()){
26                 mp[a[i]]=i;
27                 add(i,1);
28             }
29         }
30         mp.clear();
31         for(int i=n;i;i--){
32             if(mp.find(a[i])==mp.end())
33                 nxt[i]=n+1;
34             else
35                 nxt[i]=mp[a[i]];
36             mp[a[i]]=i;
37         }
38         scanf("%d",&q);
39         for(int i=0;i<q;i++){
40             scanf("%d%d",&Q[i].l,&Q[i].r);
41             Q[i].id=i;
42         }
43         sort(Q,Q+q);
44         int t=1;
45         for(int i=0;i<q;i++){
46             while(t<=n&&t<Q[i].l)
47                 add(nxt[t++],1);
48             ans[Q[i].id]=query(Q[i].r)-query(Q[i].l-1);
49         }
50         for(int i=0;i<q;i++)
51             printf("%d
",ans[i]);
52     }
53     return 0;
54 }
原文地址:https://www.cnblogs.com/chxer/p/4401116.html