Buy Tickets---poj 2828 线段树单点更新练习
2013-08-02 16:39
477 查看
/************************************************* Copyright:G Author:G Date:2013-08-02 16:24:22 Description: 1、单点更新线段树题目 2、注意要从最后一个人向前更新插队 3、更新时记录插队后的位置 *************************************************/ #include<iostream> #include<cstdio> using namespace std; struct Segtree { int left; int right; int num; }s[200000<<2]; int pos; int ans[200010]; void build(int root,int l,int r) { s[root].num = r - l + 1;//在这段区间的空位 s[root].left = l; s[root].right = r; if(l == r) { return; } int m = (l + r) >> 1; build(root<<1,l,m); build(root<<1|1,m+1,r); } void update(int root,int p) { s[root].num--;//需要占用一个位置,总数要-1 int l = s[root].left; int r = s[root].right; if(l == r) { pos = l;//此为实际插入位置 //cout<<pos<<endl; return; } int m = (l + r) >>1; if(p <= s[root<<1].num) //如果插队的位置 { update(root<<1,p); } else { p -= s[root<<1].num;//此时应该减掉前半部分的空位数目 update(root<<1|1,p); } } int x[200005],y[200005]; int main() { int i; int n; //int x,y; while(~scanf("%d",&n)) { build(1,1,n); for(i = 1; i <= n; i++) scanf("%d %d",&x[i],&y[i]); for(i = n; i >= 1; i--) { update(1,x[i]+1);//从最后一个人开始向前插队 ans[pos] = y[i]; } for(i = 1; i < n; i++) { printf("%d ",ans[i]); } printf("%d\n",ans[i]); } }
相关文章推荐
- POJ 2828 Buy Tickets(线段树 树状数组/单点更新)
- POJ 2828 Buy Tickets (线段树 单点更新 查询右界)
- POJ 2828 Buy Tickets (线段树 单点更新 变形)
- poj 2828 Buy Tickets 线段树 单点更新
- POJ 2828 Buy Tickets(线段树单点更新)
- POJ-2828 Buy Tickets【线段树 单点更新】
- POJ 2828 Buy Tickets【线段树单点更新+逆序遍历】【经典题】【模板题】
- POJ - 2828 Buy Tickets (线段树单点更新)
- Buy Tickets----POJ_2828----线段树之单点更新
- POJ 2828 Buy Tickets 线段树 单点更新
- poj 2828 Buy Tickets(动态队列·线段树单点更新)
- POJ训练计划2828_Buy Tickets(线段树/单点更新)
- poj 2828 Buy Tickets 线段树单点更新
- POJ - 2828 Buy Tickets(线段树单点更新)
- poj 2828 Buy Tickets【线段树 单点更新】
- POJ 2828 Buy Tickets(线段树--单点更新)
- POJ 2828 Buy Tickets(线段树-单点更新)
- POJ 2828 (线段树 单点更新) Buy Tickets
- poj2828 Buy Tickets 线段树,单点更新
- poj 2828 Buy Tickets(线段树-单点更新)