hdu 2852 树状数组查询元素位置
2014-07-14 14:01
417 查看
利用树状数组本身也和二分相类似
关键是找出比所需元素个数少1的下表 然后再把下标+1就可以了
不能直接找元素个数等于所求值的下表 因为树状数组是上区间包含了下区间的
所以会找到上区间的下标
#include<stdio.h>
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 222222
int c[maxn];
int lb(int x){return x&(-x);}
int sum(int x){
int ans=0;
while(x){
ans+=c[x];
x-=lb(x);
}
return ans;
}
void add(int x,int w){
while(x<maxn){
c[x]+=w;
x+=lb(x);
}
}
int get_index(int x){
int cur=0,ans=0;
for(int i=20;i>=0;i--){
ans+=(1<<i);
if(ans>=maxn||cur+c[ans]>=x)ans-=(1<<i);
else if(cur+c[ans]<x)cur+=c[ans];
}
return ans+1;
}
int main(){
int n;
while(~scanf("%d",&n)){
memset(c,0,sizeof c);
int op,a,b;
while(n--){
scanf("%d",&op);
if(op==0){
scanf("%d",&a);
add(a,1);
}
else if(op==1){
scanf("%d",&a);
int tmp=sum(a)-sum(a-1);
if(tmp==0)printf("No Elment!\n");
else add(a,-1);
}
else if(op==2){
scanf("%d%d",&a,&b);
int tmp=sum(maxn-1)-sum(a);
if(tmp<b){printf("Not Find!\n");}
else printf("%d\n",get_index(sum(a)+b));
}
}
}
return 0;
}
关键是找出比所需元素个数少1的下表 然后再把下标+1就可以了
不能直接找元素个数等于所求值的下表 因为树状数组是上区间包含了下区间的
所以会找到上区间的下标
#include<stdio.h>
#include<iostream>
#include<cstdio>
using namespace std;
#define maxn 222222
int c[maxn];
int lb(int x){return x&(-x);}
int sum(int x){
int ans=0;
while(x){
ans+=c[x];
x-=lb(x);
}
return ans;
}
void add(int x,int w){
while(x<maxn){
c[x]+=w;
x+=lb(x);
}
}
int get_index(int x){
int cur=0,ans=0;
for(int i=20;i>=0;i--){
ans+=(1<<i);
if(ans>=maxn||cur+c[ans]>=x)ans-=(1<<i);
else if(cur+c[ans]<x)cur+=c[ans];
}
return ans+1;
}
int main(){
int n;
while(~scanf("%d",&n)){
memset(c,0,sizeof c);
int op,a,b;
while(n--){
scanf("%d",&op);
if(op==0){
scanf("%d",&a);
add(a,1);
}
else if(op==1){
scanf("%d",&a);
int tmp=sum(a)-sum(a-1);
if(tmp==0)printf("No Elment!\n");
else add(a,-1);
}
else if(op==2){
scanf("%d%d",&a,&b);
int tmp=sum(maxn-1)-sum(a);
if(tmp<b){printf("Not Find!\n");}
else printf("%d\n",get_index(sum(a)+b));
}
}
}
return 0;
}
相关文章推荐
- [树状数组]hdu 2852 KiKi's K-Number# +二分查找。
- hdu 2642 二维树状数组 单点更新区间查询 模板水题
- HDU 2852 KiKi's K-Number【 树状数组 二分 】
- [HDU 4031]Attack[树状数组区间更新单点查询]
- hdu 3584 Cube (三维树状数组,更新区间,查询单点)
- 树状数组:HDU1166敌兵布阵 【单点更新,区间查询】
- HDU 3874 树状数组 边查询边更新
- HDU 2852 KiKi's K-Number(树状数组+二分)
- HDU 3333 Turing Tree 树状数组 离线查询
- [HDU 1754]I Hate It[树状数组查询+更新区间最大值]
- hdu 2838 树状数组求逆序数及交换位置产生移动的数的和
- HDU 1556 Color the ball (一维树状数组,区间更新,单点查询)
- HDU 4031 Attack(树状数组修改区间查询点)
- hdu 2852 KiKi's K-Number (树状数组)
- HDU 2852 树状数组解决第K小数 附线段树解法
- hdu 2642 二维树状数组 单点更新区间查询 模板水题
- hdu 2852 KiKi's K-Number (树状数组)
- HDU 1556(树状数组-区间修改,查询点)
- HDU 2852 线段树(查询有序位置)
- hdu 1556Color the ball (树状数组,更新区间,查询单点)