HDU 2852 (树状数组求第 k个 大于a 的数)

2014-11-24 12:04:06 · 作者: · 浏览: 0


题意:


三种操作


0 x: 向容器里加入x;
1 x: 在容器内删除x,不存在x则输出“No Elment”

2 x y: 在容器中找到大于x的第y个数,没有则输出“Not Find”


题解: 树状数组


操作1: 直接add(x,1)
操作2: 查找sum(x)和sum(x-1),差值为0则不存在x,反之,add(x,-1)即可删除一个x
操作3: 首先查找小于等于x的个数s,则找到大于x的第y个数相当于找到第s+y小数




#include 
  
     
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
          #define M 100005 #define INF 0x7ffffff #define LL __int64 using namespace std; int c[M]; int lowBit(int x) { return x&(-x); } void update(int pos,int v) { while(pos
          
           mid) ans=mid; } } if(ans==M) printf("Not Find!\n"); else printf("%d\n",ans); } int main() { int n; while(~scanf("%d",&n)) { int p,e,a,k; memset(c,0,sizeof(c)); while(n--) { scanf("%d",&p); if(p==0) { scanf("%d",&e); update(e,1); } else if(p==1) { scanf("%d",&e); if(getSum(e)-getSum(e-1)==0) printf("No Elment!\n"); else update(e,-1); } else { scanf("%d%d",&a,&k); cal(a,k); } } } return 0; }