标签: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