POJ 2828 Buy Tickets 线段树
2013-11-05 19:17
274 查看
题目: http://poj.org/problem?id=2828
很巧妙的题,逆序插入线段树,这样元素不用移动。用二叉排序树也能过。
View Code
很巧妙的题,逆序插入线段树,这样元素不用移动。用二叉排序树也能过。
#include <stdio.h> #include <string.h> const int MAXN = 200010; int pos[MAXN], val[MAXN], ans[MAXN]; struct Tree_Node { int left, right; int num; } tree[MAXN<<2]; void build(int left, int right, int step) { tree[step].left = left; tree[step].right = right; tree[step].num = right - left + 1; if(left == right) { return; } int mid = (left + right) >> 1; build(left, mid, step<<1); build(mid+1, right, step<<1|1); } void insert(int posi, int vali, int step) { tree[step].num--; if(tree[step].left == tree[step].right) { ans[tree[step].left] = vali; return; } if(posi < tree[step<<1].num) insert(posi, vali, step<<1); else insert(posi - tree[step<<1].num, vali, step<<1|1); } int main() { int n; while(scanf("%d", &n) != EOF) { build(0, n-1, 1); for(int i = 0; i < n; i++) scanf("%d %d", &pos[i], &val[i]); for(int i = n-1; i >= 0; i--) insert(pos[i], val[i], 1); for(int i = 0; i < n-1; i++) printf("%d ", ans[i]); printf("%d\n", ans[n-1]); } return 0; }
View Code
相关文章推荐
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
- POJ 2828 Buy Tickets 结构体型的线段树 学习ing
- POJ 2828 Buy Tickets (线段树,插队问题)
- POJ 2828 Buy Tickets 暑假—— 线段树1——C
- POJ2828 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 (线段树,区间修改)
- POJ2828 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(线段树)