poj 2828 Buy Tickets 线段树!!!
来源:互联网 发布:多分类roc曲线 python 编辑:程序博客网 时间:2024/05/17 04:06
只要理解 用线段记录这个区间有多少个空位就行啦!!然后根据左右孩子的空位数 进行遍历线段树
#include<iostream>#include<stdio.h>using namespace std;struct node{ int l,r,s;}a[1000000];int b[200005],val[200005],ans[200005];void build(int i,int left,int right){ a[i].l=left; a[i].r=right; a[i].s=(right-left+1); if(a[i].l==a[i].r) return ; int mid=(left+right)>>1; build(i*2,left,mid); build(i*2+1,mid+1,right);}void updata(int i,int sum,int big){ a[i].s--; if(a[i].l==a[i].r) { ans[a[i].l]=big; return; } if(a[i*2].s>=sum) updata(i*2,sum,big); else updata(i*2+1,sum-a[i*2].s,big);}int main(){ int n; while(~scanf("%d",&n)) { build(1,1,n); for(int i=1;i<=n;i++) scanf("%d%d",&b[i],&val[i]); for(int i=n;i>=1;i--) updata(1,b[i]+1,val[i]); for(int i=1;i<=n-1;i++) printf("%d ",ans[i]); printf("%d\n",ans[n]); } return 0;}