hdu 2852 树状数组

在基础上加了二分查找


#include <iostream>  
#include <stdio.h>  
#include <memory.h>  
using namespace std;  
#define M 100005
int n, a[M];    
int flage;

int lowbit(int i)  
{  
    return i&(-i);  
}  
  
void update(int i, int val)   
{  
    while(i <= M)  <span style="white-space:pre">			</span>//1
    {  
        a[i] += val;  
        i += lowbit(i);  
    }  
}  
  
int sum(int i)     
{  
    int sum = 0;  
    while(i > 0)  
    {  
        sum += a[i];  
        i -= lowbit(i);  
    }  
    return sum;  
}  
int find(int y,int z)
{
    int l=y+1,r=M-1,mid;
    int m=sum(y);
    while(l<=r)
    {
        mid=(l+r)>>1;
        if(sum(mid)-m<z)l=mid+1;
        else r=mid-1;
    }
    return l;
}
int main()  
{  
    int x,y,z;
    while(~scanf("%d",&n))
    {
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++)
        {
            scanf("%d",&x);
            if(x==0)
            {
                scanf("%d",&y);
                update(y,1);
            }
            else if(x==1)
            {
                scanf("%d",&y);
                if(sum(y)-sum(y-1)==0)
                    printf("No Elment!\n");
                else update(y,-1);
            }
            else
            {
                scanf("%d %d",&y,&z);
                if(sum(M-1)-sum(y)<z)
                    printf("Not Find!\n");
                else
                    printf("%d\n",find(y,z));
            }
        }
    }
    return 0;  
} 

注意: 这里由于不知道最大的输入数字是多少所以直接建立最大的树状数组,一开始还以为操作数是最大的数建了到n的树状数组.....WA  TAT.....

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值