HDU 2852 KiKi's K-Number(离线+树状数组)
2013-08-12 20:17
141 查看
题目链接
省赛训练赛上一题,貌似不难啊。当初,没做出。离线+树状数组+二分。
省赛训练赛上一题,貌似不难啊。当初,没做出。离线+树状数组+二分。
#include <cstdio> #include <cstring> #include <iostream> using namespace std; #define N 100000 int p[100100]; int qur[300001][3]; int lowbit(int t) { return t&(-t); } void insert(int t,int d) { while(t <= N) { p[t] += d; t += lowbit(t); } } int getsum(int t) { int sum = 0; while(t) { sum += p[t]; t -= lowbit(t); } return sum; } int bin(int x) { int str,end,mid; if(x > getsum(N)) return -1; str = 1; end = N; while(str < end) { mid = (str + end)/2; if(getsum(mid) < x) str = mid + 1; else end = mid; } return str; } int main() { int n,i; while(scanf("%d",&n)!=EOF) { memset(p,0,sizeof(p)); for(i = 0;i < n;i ++) { scanf("%d",&qur[i][0]); if(qur[i][0] == 0||qur[i][0] == 1) scanf("%d",&qur[i][1]); else scanf("%d%d",&qur[i][1],&qur[i][2]); } for(i = 0;i < n;i ++) { if(qur[i][0] == 0) insert(qur[i][1],1); else if(qur[i][0] == 1) { if(getsum(qur[i][1])-getsum(qur[i][1]-1) > 0) insert(qur[i][1],-1); else printf("No Elment!\n"); } else { int flag; flag = bin(getsum(qur[i][1])+qur[i][2]); if(flag == -1) printf("Not Find!\n"); else printf("%d\n",flag); } } } return 0; }
相关文章推荐
- HDU 2852 KiKi's K-Number 树状数组
- hdu 2852 KiKi's K-Number (线段树,求大于x的第k小数)
- HDU 2852 KiKi's K-Number
- HDU 2852 KiKi's K-Number 主席树
- HDU 2852 KiKi's K-Number 树状数组
- 查询比a大的数中的第k大的数 树状数组 hdu 2852 KiKi's K-Number
- HDU 2852 KiKi's K-Number 二分+树状数组
- HDU 2852 KiKi's K-Number 树状数组
- HDU 2852 KiKi's K-Number (主席树)
- HDU 2852 KiKi's K-Number 主席树或树状数组
- HDU 2852 KiKi's K-Number(树状数组+二分搜索)
- HDU 2852 KiKi's K-Number【 树状数组 二分 】
- hdu 2852 KiKi's K-Number 二分+树状数组
- hdu 2852 KiKi's K-Number
- HDU 2852 KiKi's K-Number 树状数组 + 二分
- HDU 2852 KiKi's K-Number 树状数组
- HDU 2852 KiKi's K-Number
- hdu 2852 KiKi's K-Number
- hdu 2852 KiKi's K-Number 树状数组
- hdu 2852 KiKi's K-Number(线段树单点更新)