线段树--poj2828 Buy tickets
来源:互联网 发布:坐淘宝banner 编辑:程序博客网 时间:2024/06/05 01:09
一开始为空队列,n个人,每次插队在第p个人后面,求最后的位置。
当最后一个人插入时,他的位置与最后的结果中的位置相同,可确定,所以倒着求。
用线段树记录区间内空格数。
#include <iostream>
#include <cstdio>
using namespacestd;
const int maxn =200000 + 5;
int seg[maxn <<2];
int val[maxn],pos[maxn],ans[maxn];
void init(int l,int r,int rt)
{
if (l == r) {
seg[rt] =1;
return;
}
int mid = (l + r) >>1;
init(l, mid, rt <<1);
init(mid +1, r, rt << 1 |1);
seg[rt] =seg[rt << 1] +seg[rt << 1 |1];
}
void update(int l,int r,int rt,int val,int pos)
{
if (l == r) {
seg[rt] =0;
ans[l] = val;
return ;
}
int mid = (l + r) >>1;
if (seg[rt <<1] >= pos) {
update(l, mid,rt <<1 , val, pos);
}
else update(mid + 1, r, rt <<1 | 1, val, pos -seg[rt << 1]);
seg[rt] =seg[rt << 1] +seg[rt << 1 |1];
}
int main()
{
int n;
while (scanf("%d",&n) !=EOF && n) {
init(1, n,1);
for (int i =0; i < n; i ++) {
scanf("%d%d",&pos[i],&val[i]);
}
for (int i = n -1; i >= 0; i --) {
update(1, n,1, val[i],pos[i] + 1 );
}
for (int i =1; i <= n; i ++) {
printf("%d",ans[i]);
if (i == n) {
printf("\n");
}
elseprintf(" ");
}
}
return0;
}
- POJ2828 Buy Tickets 线段树
- POJ2828 Buy Tickets(线段树)
- POJ2828 Buy Tickets (线段树)
- poj2828 Buy Tickets线段树
- poj2828 Buy Tickets(线段树)
- 线段树 POJ2828 Buy Tickets
- 线段树--poj2828 Buy tickets
- POJ2828:Buy Tickets(线段树单点)
- poj2828 Buy Tickets 线段树,单点更新
- poj2828 Buy Tickets 线段树端点更新
- poj2828--Buy Tickets(线段树+详解)
- poj2828 Buy Tickets 单点更新线段树
- POJ2828 Buy Tickets 线段树单点更新
- poj2828 Buy Tickets (线段树)
- poj2828 Buy Tickets(线段树,单点更新)
- POJ2828 Buy Tickets(线段树)
- Poj2828 Buy Tickets 线段树、单点更新
- POJ2828:Buy Tickets(线段树)
- Openlayers实现WFS服务及单击要素查询
- 单链表和双链表的实现
- Mac 修改hostname&computer name
- Typescript+dva搭建开发环境
- Java中的内存处理机制和final、static、final static总结
- 线段树--poj2828 Buy tickets
- Jenkins中节点运行job文件的传递
- 三层交换机 VS 二层交换机
- Maven多模块项目搭建
- LuoguP1196_银河英雄传说_KEY
- 香港敏捷培训分享
- 使用Anaconda进行环境和包的管理
- js计算时间差,包括计算,天,时,分,秒
- 大龄程序员的未来在何方