poj 2828 Buy Tickets
2014-04-24 22:41
435 查看
题目链接:http://poj.org/problem?id=2828
题目大意:给出每个人插入的位置,计算N个人插入队后,队中各个位置都是谁。
题目分析:用线段树动态的统计空余位置的数量和更新空余位置的信息。
代码参考:
题目大意:给出每个人插入的位置,计算N个人插入队后,队中各个位置都是谁。
题目分析:用线段树动态的统计空余位置的数量和更新空余位置的信息。
代码参考:
#include<cmath> #include<vector> #include<string> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef long long LL; const int M = 200009; int ans[M], pos[M], val[M]; struct SegNode { int left, right, delay; void init(int a, int b) { delay = b - a + 1; left = a; right = b; } } seg[M << 2]; int L(int n) { return n << 1; } int R(int n) { return n << 1 | 1; } void build(int N, int a, int b) { seg .init(a, b); if(a == b) { return ; } int mid = (a + b) >> 1; build(L(N), a, mid); build(R(N), mid + 1, b); } int update(int N, int id) { seg .delay--; if(seg .left == seg .right) { return seg .left; } if(seg[L(N)].delay >= id) { update(L(N), id); } else { return update(R(N), id - seg[L(N)].delay); } } int main() { int n, sum, i, m; while(~scanf("%d", &n)) { for(i=0; i<n; ++i) { scanf("%d%d", &pos[i], &val[i]); } build(1, 1, n); for(i=n-1; i>=0; --i) { ans[update(1, pos[i] + 1)] = val[i]; } for(i=1; i<=n; ++i) { printf("%d%c", ans[i], i == n ? '\n' : ' '); } } return 0; }
相关文章推荐
- POJ 2828 Buy Tickets(线段树的单点更新)
- POJ 2828 Buy Tickets(神题!线段树or树状数组)
- 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 poj 2828 Buy Tickets 【树状数组,已知前n项和为K,返回n值】
- POJ 2828 Buy Tickets(线段树)
- POJ 2828 Buy Tickets 线段树
- 线段树端点更新 poj 2828 Buy Tickets
- poj2828 Buy Tickets
- poj 2828 Buy Tickets 【线段树点更新】
- POJ 2828 Buy Tickets 线段树单点更新
- Buy Tickets(poj 2828)
- POJ 2828 Buy Tickets 线段树 + 思维
- poj 2828--Buy Tickets(线段树)