hdu 2852 KiKi's K-Number (線段樹)

hdu 2852ios

題意:數組

  一個容器,三種操做:spa

    (1) 加入一個數 ecode

    (2) 刪除一個數 e,若是不存在則輸出 No Elment! blog

    (3) 查詢比a大的數中的第k小數,不存在就輸出 Not Find!get

解法:string

  關於第三點,能夠先查詢小於等於a的數的個數cnt,而後直接查詢第cnt+k小數就好了 。
it

  二分+樹狀數組 或者 主席樹(有點殺雞用牛刀的感受 。。。) 也是能夠作的  _(:з」∠)_ io

 

code:線段樹

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cmath>
 5 #include <cstring>
 6 #include <queue>
 7 #include <set>
 8 #include <vector>
 9 #include <map>
10 #define ll long long
11 
12 using namespace std;
13 
14 const int N=1e5+7;
15 
16 int L[N*4],R[N*4],cnt[N*4];
17 
18 inline void bulidtree(int l,int r,int k){
19     L[k]=l; R[k]=r;
20     cnt[k]=0;
21     if (l==r) return;
22     int mid=(l+r)>>1;
23     bulidtree(l,mid,k<<1);
24     bulidtree(mid+1,r,(k<<1)|1);
25 }
26 
27 inline void update(int p,int d,int k){
28     cnt[k]+=d;
29     if (L[k]==R[k]) return;
30     int mid=(L[k]+R[k])>>1;
31     if (p<=mid) update(p,d,k<<1);
32     else update(p,d,(k<<1)|1);
33 }
34 
35 inline int query(int x,int y,int k){
36     if (L[k]==x && R[k]==y)
37         return cnt[k];
38     int mid=(L[k]+R[k])>>1;
39     if (y<=mid) return query(x,y,k<<1);
40     else if (x>mid) return query(x,y,(k<<1)|1);
41     else return query(x,mid,k<<1)+query(mid+1,y,(k<<1)|1);
42 }
43 
44 inline int find(int x,int k){
45     if (cnt[k]<x) return -1;
46     while (L[k]!=R[k]){
47         if (x<=cnt[k<<1]) k=k<<1;
48         else {
49             x-=cnt[k<<1];
50             k=(k<<1)|1;
51         }
52     }
53     return L[k];
54 }
55 
56 int main(){
57     int m;
58     while (~scanf("%d",&m)){
59         int p,x,y;
60         bulidtree(1,N-7,1);
61         while (m--){
62             scanf("%d",&p);
63             switch(p){
64                 case 0:
65                     scanf("%d",&x);
66                     update(x,1,1);
67                     break;
68                 case 1:
69                     scanf("%d",&x);
70                     if (query(x,x,1)) update(x,-1,1);
71                     else puts("No Elment!");
72                     break;
73                 case 2:
74                     scanf("%d%d",&x,&y);
75                     int ans=find(query(1,x,1)+y,1);
76                     if (~ans) printf("%d\n",ans);
77                     else puts("Not Find!");
78                     break;
79             }
80         }
81     }
82     return 0;
83 }
相關文章
相關標籤/搜索