您的位置:首页 > 其它

poj2828 Buy Tickets

2012-07-27 16:05 369 查看
PS: 起初,很多人说这道题是一道线段树题,可是为什么呢?我一直没有头绪,后来看了解题报告的第一行,我明白了。原来这道题就是基本的线段树。

那个解题报告的第一行写着:倒叙插入,位置就是前边的空格数。如果对线段树了解的话,那你也就明白了。

废话不说了,上代码……

View Code

#include<iostream>
#include<string>
#include<queue>
#include<map>
#include<stack>
#include<cmath>
#include<functional>
#include<algorithm>
using namespace std;
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 200010;
int sum[maxn<<2];
int result[maxn];
int n;
pair<int,int> order[maxn];

int operate(int a,int b){
return a+b;
}

void PushUp(int rt){
sum[rt]=operate(sum[rt<<1],sum[rt<<1|1]);
}

void bulid(int l=1,int r=n,int rt=1){
if(l==r){
sum[rt]=1;return ;
}
int m=(l+r)>>1;
bulid(lson);
bulid(rson);
PushUp(rt);
}

void update(int p,int add,int l=1,int r=n,int rt=1){
if(l==r){
sum[rt]=0;
result[l]=add;
return ;
}
int m=(l+r)>>1;
if(p<sum[rt<<1])update(p,add,lson);
else update(p-sum[rt<<1],add,rson);
PushUp(rt);
}

int main(){

int tmp[maxn];
while(~scanf("%d",&n)){
bulid();

for(int i=0;i<n;i++){
scanf("%d%d",&order[i].first,&order[i].second);
}
for(int i=n-1;i>=0;i--){
update(order[i].first,order[i].second);
}
for(int i=1;i<=n;i++){
printf("%d%c",result[i],(i^n)?' ':'\n');
}

}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: