您的位置:首页 > 其它

[树状数组]hdu 2852 KiKi's K-Number# +二分查找。

2012-08-10 16:24 260 查看
/**
[树状数组]hdu 2852 KiKi's K-Number# +二分查找。
注意这里delete某个元素的时候只删除一个,就是说push进的每个数都是不同的。
*/
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;

#define N 100001
#define lowbit(i) (i) &(-i)
int b
;

void add(int i,int c)
{
for(; i < N; i += lowbit(i))
b[i] += c;
}
int sum(int i)
{
int ans = 0;
for(; i > 0; i -= lowbit(i))
ans += b[i];
return ans;
}
int main()
{
int m,p,a,k,l,r,mid,sa;
while(scanf("%d",&m) == 1)
{
memset(b,0,sizeof(b));
while(m--)
{
scanf("%d",&p);
if(p == 0)
{
scanf("%d",&a);
add(a,1);
}
else if(p == 1)
{
scanf("%d",&a);
k = sum(a) - sum(a-1);
if(k == 0)
printf("No Elment!\n");
else
add(a,-1);
}
else
{
scanf("%d%d",&a,&k);
sa = sum(a);
r = sum(N-1) - sa;
if(r < k)
{
printf("Not Find!\n");
continue;
}
l = a + 1,r = N - 1;

while( l <= r)
{
mid = (l + r) >> 1;
if(sum(mid-1) - sa < k && sum(mid) - sa >= k)
{
r = mid;
break;
}
if(sum(mid)- sa < k)
l = mid + 1;
else
r = mid;
}
printf("%d\n",r);
}
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: