zoukankan      html  css  js  c++  java
  • 离线不同数

     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 }
  • 相关阅读:
    Add Two Numbers
    Reverse Linked List II
    Reverse Linked List
    Remove Duplicates from Sorted List
    Remove Duplicates from Sorted List II
    Partition List
    Intersection of Two Linked Lists
    4Sum
    3Sum
    2Sum
  • 原文地址:https://www.cnblogs.com/chxer/p/4401116.html
Copyright © 2011-2022 走看看