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——线段树的其他信息维护的更多相关文章

  1. poj 2828 Buy Tickets (线段树(排队插入后输出序列))

    http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissio ...

  2. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

  3. POJ 2828 Buy Tickets 线段树 倒序插入 节点空位预留(思路巧妙)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19725   Accepted: 9756 Desc ...

  4. POJ 2828 Buy Tickets | 线段树的喵用

    题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以 ...

  5. POJ 2828 Buy Tickets(线段树&#183;插队)

    题意  n个人排队  每一个人都有个属性值  依次输入n个pos[i]  val[i]  表示第i个人直接插到当前第pos[i]个人后面  他的属性值为val[i]  要求最后依次输出队中各个人的属性 ...

  6. POJ 2828 Buy Tickets(线段树单点)

    https://vjudge.net/problem/POJ-2828 题目意思:有n个数,进行n次操作,每次操作有两个数pos, ans.pos的意思是把ans放到第pos 位置的后面,pos后面的 ...

  7. poj 2828 Buy Tickets (线段树)

    题目:http://poj.org/problem?id=2828 题意:有n个人插队,给定插队的先后顺序和插在哪个位置还有每个人的val,求插队结束后队伍各位置的val. 线段树里比较简单的题目了, ...

  8. Buy Tickets 【POJ - 2828】【线段树】

    题目链接 有N次操作,每次都是将第i个数放置在第pos个数的后面,并且这个数的值是val. 这个线段树的思维确实很好,我们可以发现,后面放进去的数,一定是强制位置的,而前面放的数,会随着后面的数进入而 ...

  9. [poj2828] Buy Tickets (线段树)

    线段树 Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must ...

随机推荐

  1. 【转载】SSAS-MDX#001 - MDX 基本结构

    1. MDX 的基本结构 - MDX 的基本结构有三种: Members, Tuple 和 Set    2. Members - 指的是维度树上的一个节点, 这里有一点需要指出, 量度也是一个特殊的 ...

  2. 在 Go 语言中使用 Log 包--转自GCTT

    Linux 在许多方面相对于 Windows 来说都是独特的,在 Linux 中编写程序也不例外.标准输出,标准 err 和 null devices 的使用不仅是一个好主意,也是一个原则.如果您的程 ...

  3. CentOS7 安装 Visual Code

    官网下载 rpm 安装文件 运行 rpm -ivh 试一下 sudo rpm -ivh xxx.rpm 有可能弹出提出:libxx.so() need by xxxrpm ,反正意思是缺组件,去下载安 ...

  4. eclipse中怎样添加项目至SVN资源库

    转自:https://jingyan.baidu.com/article/642c9d341caac0644a46f73e.html 这是一个SVN最基本的一个使用方法,转一篇别人写的,方便日后查询. ...

  5. 第十篇--------javascript函数-参数

    javascript函数的参数:形参,实参 //function 参数 //形参列表 function test(a,b,c,d){ //alert(test.length); //形参个数,4个 / ...

  6. 【数组】word search

    题目: Given a 2D board and a word, find if the word exists in the grid. The word can be constructed fr ...

  7. Hibernate5.1+Sqlserver2000分页查询

    前几天改到一个bug:从MS SQLserver上面同步表结构并且采集数据写入其他库.然后用的核心技术是用的Hibernate. 其中bug出在SQLServer2000版本上.排查下来发现2000版 ...

  8. C#定义一个类,并生成属性的例子

    class Person { private string name; private string age; private string job; public Person(string nam ...

  9. Eclipse: User Operation is waiting for “Building Workspace”

    这个情况可能有多个原因导致,比如,非正常关闭eclipse,时钟不匹配等等,可能解决的方法有: 1. 删除<workspace_folder>/.metadata/.lock文件 2. e ...

  10. 重温js基础部分

    临近面试,因此打算回过头来巩固一下js的一些基础部分,同时也是为了记录自己的一些比较薄弱的点. 1.typeof操作符 typeof返回一个基本数据类型,包括number,string,boolean ...