标签:des style color java os io strong for
5 0 5 1 2 0 6 2 3 2 2 8 1 7 0 2 0 2 0 4 2 1 1 2 1 2 2 1 3 2 1 4
No Elment! 6 Not Find! 2 2 4 Not Find!
0 表示添加节点
1表示删除节点
2 找到比b大的第k大的数
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#define init(a) memset(a,0,sizeof(a))
using namespace std;
#define MAX INT_MAX
#define MIN INT_MIN
#define LL __int64
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 300010;
const int maxm = 100010;
using namespace std;
int c[maxn];
int hash[maxm];
int lowbit(int x)
{
return x&(-x);
}
void add(int x,int w)
{
while(x<=maxn)
{
c[x]+=w;
x+=lowbit(x);
}
}
int sum(int i)
{
int s=0;
while(i>0)
{
s += c[i];
i =i - lowbit(i);
}
return s;
}
void B_search(int b,int k)
{
int tem = sum(b);
int low = b;
int high = maxm;
int mid;
while(low <= high)
{
mid = (low + high) /2;
int st = sum(mid);
if(hash[mid]>0 && st-hash[mid]-tem<k&&st-tem>=k)//减hash是因为可能存在多个相同元素的情况
{
break;
}
if(st-tem<k)
{
low = mid + 1;
}
else
high = mid - 1;
}
printf("%d\n",mid);
}
bool query(int b,int k)
{
if(sum(maxn)-sum(b)<k)return 0;
B_search(b,k);
return 1;
}
int main()
{
int n,a,b,k;
while(scanf("%d",&n)!=EOF)
{
init(c);
init(hash);
for(int i=0;i<n;i++)
{
scanf("%d",&a);
if(a==0)
{
scanf("%d",&b);
add(b,1);
hash[b]++;
}
else if(a==1)
{
scanf("%d",&b);
if(hash[b]>0)
{
add(b,-1);
hash[b]--;
}
else
puts("No Elment!");
}
else if(a==2)
{
scanf("%d%d",&b,&k);
bool tep = query(b,k);
if(!tep)
puts("Not Find!");
}
}
}
return 0;
}HDU 2852 KiKi's K-Number(树状数组+二分),布布扣,bubuko.com
HDU 2852 KiKi's K-Number(树状数组+二分)
标签:des style color java os io strong for
原文地址:http://blog.csdn.net/wjw0130/article/details/38555419