//后面的点优先权高,思路详解http://www.cnblogs.com/CheeseZH/archive/2012/04/29/2476134.html
#include <iostream>
#include <cstring>
#include <cstdio>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
const int N=200005;
int sum[N << 2];//存的是有多少个空位
int pos[N],val[N],ans[N];
int id;
void pushup(int rt){
sum[rt]=sum[rt << 1]+sum[rt << 1 | 1];
}
void build(int l,int r,int rt){
if(l==r){
sum[rt]=1;
return ;
}
int m= (l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(int k,int l,int r,int rt){
sum[rt]--;
if(l == r){
id=l;
return ;
}
int m=(l+r)>>1;
if(k <= sum[rt<<1])update(k,lson);//k <= sum[rt<<1]
else {
k-=sum[rt<<1];
update(k,rson);
}
pushup(rt);
}
int main()
{
int n;
while(scanf("%d",&n)==1){
build(1,n,1);
for(int i=0;i<n;i++)scanf("%d%d",pos+i,val+i);
for(int i=n-1;i>=0;i--){
update(pos[i]+1,1,n,1);//pos[i]+1
ans[id]=val[i];
}
for(int i=1;i<n;i++)printf("%d ",ans[i]);
printf("%d\n",ans[n]);
}
return 0;
}
poj2828Buy Tickets segment_tree
区间树更新与查询算法
最新推荐文章于 2017-05-14 21:10:09 发布
本文介绍了一种基于区间树的数据结构实现,用于解决特定类型的区间更新与查询问题。通过递归地将区间分为左右子区间,并维护每个节点中空位的数量来高效地完成更新操作。文章提供了一个完整的C++实现示例,展示了如何构建区间树、更新区间以及查询指定位置的值。
624

被折叠的 条评论
为什么被折叠?



