KiKi's K-Number HDU - 2852 树状数组+二分

#include<iostream>
#include<cstring> 
using namespace std;
const int N = 100005;
int tr[N];
int lowbit(int x)
{
    return x&(-x);
}
void add(int x,int a)
{
    for(int i=x;i<N;i+=lowbit(i))
        tr[i]+= a;
}
int sum(int x)
{
    int ans=0;
    for(int i=x;i;i-=lowbit(i))
        ans+=tr[i];
    return ans;
}
void bs(int a,int k)
{
    int l=a+1,r=N;
    int temp=sum(a);
    while(l<=r)
    {
        int mid=l+r>>1;
        if(sum(mid)-temp<k)
            l=mid+1;
        else
        //有点懵 
            r=mid-1;
    }
    if(l>=N)
        printf("Not Find!\n");
    else
        printf("%d\n",l);
}
int main()
{
    int m;
    while(~scanf("%d",&m))
    {
        memset(tr,0,sizeof tr);
        while(m--)
        {
            int q,a,k;
            scanf("%d",&q);
            if(q==0)
            {
                scanf("%d",&a);
                add(a,1);
            }
            else if(q==1)
            {
                scanf("%d",&a);
                //如果存在 
                if(sum(a)-sum(a-1))
                    add(a,-1);
                else
                    printf("No Elment!\n");
            }
            else
            {
                scanf("%d%d",&a,&k);
                bs(a,k);
            }
        }
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/QingyuYYYYY/p/12288894.html