POJ P2828 Buy Ticket——线段树的其他信息维护
Description
Railway tickets were difficult to buy around the Lunar New Year in China, so we must get up early and join a long queue…
The Lunar New Year was approaching, but unluckily the Little Cat still had schedules going here and there. Now, he had to travel by train to Mianyang, Sichuan Province for the winter camp selection of the national team of Olympiad in Informatics.
It was one o’clock a.m. and dark outside. Chill wind from the northwest did not scare off the people in the queue. The cold night gave the Little Cat a shiver. Why not find a problem to think about? That was none the less better than freezing to death!
People kept jumping the queue. Since it was too dark around, such moves would not be discovered even by the people adjacent to the queue-jumpers. “If every person in the queue is assigned an integral value and all the information about those who have jumped the queue and where they stand after queue-jumping is given, can I find out the final order of people in the queue?” Thought the Little Cat.
--by POJ
http://poj.org/problem?id=2828
题目大意:
操作 i val;
序列在i+1位置插入点val;
输出最终的序列结果;
多组数据;
相似的题目 POJ hotel
(学习不深入的结果就是导致对一个点重复学习)
对一个序列预留空位,维护空位个数;
由于后操作影响前操作,故倒序维护操作;
对于每个操作 i val ,把她的val放在当前第i+1个空位上,然后占用该空位;
总结:
线段树可以维护对序列的加点操作,方法如上;
可以维护对序列的合法区间覆盖操作方法见POJ hotel;
这两个操作有相似性——线段树查询合法位置:
对原序列合法的要求,
如,空位个数,显然满足区间叠加性质;
如,区间最大连续空子段,显然也满足;
关键是找出什么是合法二字的要求;
代码如下:
#include<cstdio>
using namespace std;
const int MAXN=;
int n;
int tree[MAXN<<];
int que[MAXN];
int pos[MAXN],val[MAXN];
void up(int );
void build(int ,int, int );
int find(int ,int ,int ,int );
int main()
{
int i,j,k;
while(scanf("%d",&n)==){
build(,n,);
for(i=;i<=n;i++)
scanf("%d%d",&pos[i],&val[i]);
for(i=n;i>=;i--){
pos[i]++;
j=find(,n,,pos[i]);
que[j]=val[i];
}
for(i=;i<=n;i++)
printf("%d ",que[i]);
printf("\n");
}
return ;
}
void up(int nu){
tree[nu]=tree[nu<<]+tree[nu<<|];
}
void build(int l,int r,int nu){
if(l==r){
tree[nu]=;
return ;
}
int mid=(l+r)>>;
build(l,mid,nu<<);
build(mid+,r,nu<<|);
up(nu);
}
int find(int l,int r,int nu,int x){
int mid=(l+r)>>,ans;
if(l==r){
tree[nu]=;
return l;
}
if(tree[nu<<]>=x)
ans=find(l,mid,nu<<,x);
else
ans=find(mid+,r,nu<<|,x-tree[nu<<]);
up(nu);
return ans;
}
POJ P2828 Buy Ticket——线段树的其他信息维护的更多相关文章
- poj 2828 Buy Tickets (线段树(排队插入后输出序列))
http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissio ...
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...
- POJ 2828 Buy Tickets 线段树 倒序插入 节点空位预留(思路巧妙)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19725 Accepted: 9756 Desc ...
- POJ 2828 Buy Tickets | 线段树的喵用
题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以 ...
- POJ 2828 Buy Tickets(线段树·插队)
题意 n个人排队 每一个人都有个属性值 依次输入n个pos[i] val[i] 表示第i个人直接插到当前第pos[i]个人后面 他的属性值为val[i] 要求最后依次输出队中各个人的属性 ...
- POJ 2828 Buy Tickets(线段树单点)
https://vjudge.net/problem/POJ-2828 题目意思:有n个数,进行n次操作,每次操作有两个数pos, ans.pos的意思是把ans放到第pos 位置的后面,pos后面的 ...
- poj 2828 Buy Tickets (线段树)
题目:http://poj.org/problem?id=2828 题意:有n个人插队,给定插队的先后顺序和插在哪个位置还有每个人的val,求插队结束后队伍各位置的val. 线段树里比较简单的题目了, ...
- Buy Tickets 【POJ - 2828】【线段树】
题目链接 有N次操作,每次都是将第i个数放置在第pos个数的后面,并且这个数的值是val. 这个线段树的思维确实很好,我们可以发现,后面放进去的数,一定是强制位置的,而前面放的数,会随着后面的数进入而 ...
- [poj2828] Buy Tickets (线段树)
线段树 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must ...
随机推荐
- python 爬虫入门之爬小说
##第一步 导包from bs4 import BeautifulSoupimport requestsimport sys ##准备class downloder(object): def __in ...
- php pdo prepare真的安全吗
详见 这里 Let's say I have code like this: $dbh = new PDO("blahblah"); $stmt = $dbh->prepar ...
- 解决pymysql.err.InternalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x8C\\xB8' for column 'headline' at row 1")
解决pymysql.err.InternalError: (1366, "Incorrect string value: '\\xF0\\x9F\\x8C\\xB8' for column ...
- 启动多个appium服务(同时运行多台设备)
准备: 一台真机一台模拟器(使用的是“夜神模拟器”) 先查看是否检测到设备 adb devices 由上图可看出没有检测到模拟器(夜神模拟器已开启) 可通过以下配置完成: 第一步:找到adb的 ...
- CentOS 7 安装程序介绍
(一).引导菜单 使用 UEFI 引导 Install CentOS Linux 7 选择此选项开始在你的计算机系统中使用图形安装程序安装 CentOS 7 Test this media & ...
- 必须声明表变量 "@P0"
mybatis提示错误 ### Cause: com.microsoft.sqlserver.jdbc.SQLServerException: 必须声明表变量 "@P0". ; u ...
- Java NIO学习与记录(八): Reactor两种多线程模型的实现
Reactor两种多线程模型的实现 注:本篇文章例子基于上一篇进行:Java NIO学习与记录(七): Reactor单线程模型的实现 紧接着上篇Reactor单线程模型的例子来,假设Handler的 ...
- chainWebpack 和 htmlWebpackPlugin搭配使用
const HtmlWebpackPlugin = require('html-webpack-plugin'); ... chainWebpack: config => { config .p ...
- Mac 10.12安装虚拟机软件VMware Fusion 12
说明:VMware创建的虚拟机是全平台通用的,如果要在Mac下识别,那么在虚拟机的文件夹后面增加后缀[.vmwarevm] 下载: (链接: https://pan.baidu.com/s/1eSLE ...
- 使用NHibernate(4)--拦截器和事件
如果想在一个事务的开始.执行中.完成后等过程中执行一些自己的逻辑(比如记录日志.查看sql),拦截器(Interceptors)和事件(Event)就可以发挥作用了.两者所能完成的功能差不多. 1,拦 ...