hdu2852 KiKi's K-Number

题意:给定三个操作添加删除查询大于a的的第k大值----树状数组的逆向操作

给定a利用BIT查询有多少值比a小,这样比a大的k大值就应该有k+sum(a)个小于他的值

因此可以二分枚举k大值看看是不是满足条件。这里有一点需要注意,就是二分出答案时当前答案的的数量一定大于1因为这个wa了一次

详见代码:

 1 #include <cstring>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 const int MAX = 100000+10;
 6 const int inf = 0x3f3f3f3f;
 7 int c[MAX],n,use[MAX];
 8 int lowbit(int x)
 9 {
10     return x&(-x);
11 }
12 void add(int x,int d)
13 {
14     for(int i=x;i<=MAX-2;i+=lowbit(i))
15     {
16         c[i]+=d;
17     }
18 }
19 int sum(int x)
20 {
21     int ans=0;
22     for(int i=x;i>=1;i-=lowbit(i))
23     {
24         ans+=c[i];
25     }
26     return ans;
27 }
28 int solve(int a,int k)
29 {
30     if(sum(MAX-2)-sum(a)<k) return 0;
31     int i=sum(a),flag=0,mid;
32     int low=a;
33     int high= MAX -2;
34     while(low<=high)
35     {
36         mid=(low+high)>>1;
37         int ans=sum(mid);
38         if(use[mid]&&ans-use[mid]<k+i&&ans>=k+i){flag=1break;}
39         else if(ans<k+i) low=mid+1;
40         else high=mid-1;
41     }
42     if(flag) return  mid;
43     else return 0;
44 }
45 int main()
46 {
47     int p,a,k;
48     while(scanf("%d",&n)>0)
49     {
50         memset(use,0,sizeof(use));
51         memset(c,0,sizeof(c));
52         for(int i=0;i<n;i++)
53         {
54             scanf("%d",&p);
55             if(!p)
56             {
57                 scanf("%d",&a);
58                 add(a,1);
59                 use[a]++;
60             }
61             else if(p==1)
62             {
63                 scanf("%d",&a);
64                 if(use[a]<=0) printf("No Elment! ");
65                 else
66                 {
67                     add(a,-1);
68                     use[a]--;
69                 }
70             }
71             else
72             {
73                 scanf("%d %d",&a,&k);
74                 int ans=solve(a,k);
75                 if(!ans) printf("Not Find! ");
76                 else printf("%d ",ans);
77             }
78         }
79     }
80     return 0;

81 } 

原文地址:https://www.cnblogs.com/acvc/p/3536349.html