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(线段树&;#183;插队)
题意 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 ...
随机推荐
-
C++ constructor
From <<C++ primer>> struct Sales_data { // constructors added Sales_data() = default; Sa ...
-
JavaSE基础01
JavaSE基础篇01 ------从今天开始,我就学习正式java了,O(∩_∩)O哈哈~,请大家多指教哦 一.Windows常见的dos命令 操作dos命令: win7 --->开始 --- ...
-
Python,Jupyter Notebook,IPython快速安装教程
0.安装环境 Windows10,Python3.5.1,IPython,jupyter notebook,and other functionality 官方安装文档Linux版3.x 官方安装文档 ...
-
创建本地yum软件源,为本地Package安装Cloudera Manager、Cloudera Hadoop及Impala做准备
一.包管理工具及CentOS的yum 1.包管理工具如何发现可以用的包 包管理工具依赖一系列软件源,工具下载源的信息存储在配置文件中,其位置随某包管理工具不同而变化 使用yum的RedHat/Cent ...
-
VS2010编译Qt5.4.0静态库
http://www.kavenblog.com/?p=375 1.Qt的跨平台十分优秀,但是在Windows上是还是会有许多问题,其中之一就是动态链接库的问题,Qt程序的发布必须带一个体积不小的DL ...
-
关于HttpServlet和Servlet以及doPost和doGet关系
这两天在看Servlet和Jsp,spring太难了,还是先看看基础,只怪自己太弱了. Servlet是一个接口,本身定义的是一种网络服务,HttpServlet是已经实现了Servlet接口,也就是 ...
-
OpenCL 查询平台和设备
▶ 查询平台和设备的代码以结果,放在这里方便以后逐渐扩充和查询(没有营养) #include <stdio.h> #include <stdlib.h> #include &l ...
-
Java_常用API
1.基本类型包装类 1.1 概述 在实际程序使用中,程序界面上用户输入的数据都是以字符串类型进行存储的.而程序开发中,我们需要把字符串数据,根据需求转换成指定的基本数据类型,如年龄需要转换成int类型 ...
-
Centos简介(一)
Centos作为主流的一种Linux操作系统,我们选用Centos,主要是免费,以及稳定. Centos详细介绍,请参考 百度百科
-
ABAP的include关键字,Java的import, C的include和C4C ABSL 的import比较
ABAP 使用关键字重复引入一个include program,会报syntax error: 原因是因为ABAP对include这个关键字的实现和其他编程语言有点不一样,在激活时简单地把被inclu ...