zoukankan      html  css  js  c++  java
  • 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 } 

  • 相关阅读:
    在VC中设置某些文件不参加编译的方法
    VC7/VC8开发的库在VC6中的使用问题转载
    *.tar.bz2文件解压
    设置VC工程为Debug或Releas版本的方法
    Linux下设置环境变量命令export
    Source insight中设置字体方法
    双系统或虚拟机中与主机时间不一致解决方法
    制作启动光盘方法
    Linux下nfs服务器搭建
    ghost的备份与恢复转载
  • 原文地址:https://www.cnblogs.com/acvc/p/3536349.html
Copyright © 2011-2022 走看看