hdu 2852 树状数组

思路:加一个数e就用update(e,1)。删除元素e就用update(e,-1)。找比a大的第k大的元素就用二分查找。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define Maxn 120010
#define lowbit(x) (x&(-x))
using namespace std;
int C[Maxn];
int Sum(int pos)
{
    int sum=0;
    while(pos)
    {
        sum+=C[pos];
        pos-=lowbit(pos);
    }
    return sum;
}
void update(int pos,int val)
{
    while(pos<=120010)
    {
        C[pos]+=val;
        pos+=lowbit(pos);
    }
}
int main()
{
    int m,i,j,p,k,e,num,a;
    while(scanf("%d",&m)!=EOF)
    {
        num=0;
        memset(C,0,sizeof(C));
        while(m--)
        {
            scanf("%d",&p);
            if(p==0)
            {
                scanf("%d",&e);
                update(e,1);
                num++;
            }
            if(p==1)
            {
                scanf("%d",&e);
                if(Sum(e)-Sum(e-1))
                {
                    update(e,-1);
                    num--;
                }
                else
                    printf("No Elment!\n");
            }
            if(p==2)
            {
                scanf("%d%d",&a,&k);
                int l,r,mid,temp;
                int mins;
                mins=Sum(a);
                l=a,r=120000;
                if(!num||num-mins<k)
                {
                    printf("Not Find!\n");
                    continue;
                }
                while(l<r)
                {
                    mid=(l+r)>>1;
                    temp=Sum(mid)-mins;
                    if(temp>=k)
                        r=mid;
                    else
                        l=mid+1;
                }
                if(r>a)
                    printf("%d\n",r);
                else
                    printf("Not Find!\n");
            }
        }
    }
    return 0;
}

 

posted @ 2013-07-31 09:23  fangguo  阅读(118)  评论(0编辑  收藏  举报