poj2828
很容易想到一种动态的做法:平衡树……
或者是二分+树状数组
但,前者编程复杂度较大,而且据说会被卡(没试过);后者理论上超时(据说可以擦边过?);
所以要尝试新的算法;
倒着考虑,显然最后一个对象的位置是最容易确定,顺带着,容易发现,
在第i个人后插入,就是在当前队列中前面有i个空位的空位置;
于是还是可以用平衡数……
当然更简单快捷的方法是线段树,每个节点表示这个区间还有的空位数;
然后类比平衡树的查找k大,很快就能写成
var tree:array[..] of longint;
p,a,w:array[..] of longint;
n,i:longint; procedure build(i,l,r:longint);
var m:longint;
begin
tree[i]:=r-l+;
m:=(l+r) shr ;
if l<>r then
begin
build(i*,l,m);
build(i*+,m+,r);
end;
end; function ask(i,l,r,k:longint):longint;
var m:longint;
begin
if l=r then
begin
tree[i]:=;
exit(l);
end;
m:=(l+r) shr ;
if tree[i*]>k then
begin
dec(tree[i*]); //在查找的过程中顺便把区间空位数更新
exit(ask(i*,l,m,k));
end
else begin
dec(tree[i*+]);
exit(ask(i*+,m+,r,k-tree[i*])); //有没有觉得很平衡树找区间k值神似
end;
end; begin
while not eoln do
begin
readln(n);
fillchar(tree,sizeof(tree),);
build(,,n);
for i:= to n do
readln(p[i],a[i]);
for i:=n downto do
w[i]:=ask(,,n,p[i]); //w代表每个点的位置
for i:= to n do
p[w[i]]:=a[i];
for i:= to n do
begin
write(p[i]);
if i<>n then write(' '); //注意别PE了
end;
writeln;
end;
end.
poj2828的更多相关文章
- 【POJ2828】Buy Tickets(线段树)
题意:有一个输入序列,每次操作要把b[i]插入到第a[i]个,在第a[i]个后面的要后移,问最后序列. n<=200000 思路:顺序来只能用splay维护 考虑倒序,对于插入到第K个位置,在线 ...
- 【poj2828】Buy Tickets 线段树 插队问题
[poj2828]Buy Tickets Description Railway tickets were difficult to buy around the Lunar New Year in ...
- poj2828 Buy ticket
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
- poj2828 BuyTickets 线段树
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 17326 Accepted: 8601 Desc ...
- poj2828(线段树查找序列第k小的值)
题目链接:https://vjudge.net/problem/POJ-2828 题意:有n个人,依次给出这n个人进入队列时前面有多少人p[i],和它的权值v[i],求最终队列的权值序列. 思路:基本 ...
- 【poj2182】【poj2828】树状数组/线段树经典模型:逆序查找-空位插入法
poj2182题意:有一个1~n的排列,现在给定每个人前面有多少个人的编号比他大,求这个排列是什么.n<=8000 poj2182题解: 逆序做,可以确定二分最后一个是什么,然后删除这个数.树状 ...
- POJ-2828 Buy Tickets---线段树+逆序
题目链接: https://cn.vjudge.net/problem/POJ-2828 题目大意: 插队的问题,每个案例给出n,代表有n个插队的,每个给出p,v,意思是代号为v的人插在了第p个人的后 ...
- [POJ2828] Buy Tickets(待续)
[POJ2828] Buy Tickets(待续) 题目大意:多组测试,每组给出\(n\)条信息\((a,b)\),表示\(b\)前面有\(a\)个人,顺序靠后的信息优先级高 Solution.1 由 ...
- POJ2828 Buy Tickets[树状数组第k小值 倒序]
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19012 Accepted: 9442 Desc ...
- 【poj2828】Buy Tickets
Description Railway tickets were difficult to buy around the Lunar New Year in China, so we must get ...
随机推荐
- [译]线程生命周期-理解Java中的线程状态
线程生命周期-理解Java中的线程状态 在多线程编程环境下,理解线程生命周期和线程状态非常重要. 在上一篇教程中,我们已经学习了如何创建java线程:实现Runnable接口或者成为Thread的子类 ...
- delphi 仅带下划线的TEdit控件
在做录入框的时候,很希望有一个只带下划线的文本框,网上介绍的很多,有自己做组件的,须不知Delphi下只需要简单设置几个属性即可达到目的.
- 【Entity Framework】初级篇--ObjectContext、ObjectQuery、ObjectStateEntry、ObjectStateManager类的介绍
本节,简单的介绍EF中的ObjectContext.ObjectQuery.ObjectStateEntry.ObjectStateManager这个几个比较重要的类,它们都位于System.Data ...
- linux编程之指针
这个是数组指针.指针数组.二维数组之间相互转换的代码 #include<stdio.h> void main() { ][]={,,,,,,,}; int *b=NULL; int **c ...
- 过长文字自动换行的技巧 Word-Break Word-Wrap
在很多时候,为了防止内容过长把表格或容器撑破, 我们都需要为容器加上自动换行的功能. 实现自动换行,用CSS来实现,通常有两种方式: word-break: 取值为 normal, break-all ...
- Java连接redis的使用示例
在多线程下使用Jedis 在不同的线程中使用相同的Jedis实例会发生奇怪的错误.但是创建太多的实现也不好因为这意味着会建立很多sokcet连接,也会导致奇怪的错误发生.单一Jedis实例不是线程安全 ...
- CSS3新的字体尺寸单位rem
CSS3引入新的字体尺寸单位 rem ,可以简单记忆为root rm. CSS3的出现,他同时引进了一些新的单位,包括我们今天所说的rem.在W3C官网上 是这样描述rem的——“font size ...
- [scalability] Find all documents that contain a list of words
Given a list of millions of documents, how would you find all documents that contain a list of words ...
- [转载]OpenFileDialog对话框Filter属性
首先说明一个示例,分析一下Filter属性的构成:“ Excel文件|*.xls ”,前面的“Excel文件”成为标签,是一个可读的字符串,可以自定定义,“|*.xls”是筛选器,表示筛选文件夹中后缀 ...
- uva 567
Floyd 算法 就输入麻烦点 #include <iostream> #include <cstring> #include <cstdlib> #inclu ...