很容易想到一种动态的做法:平衡树……

或者是二分+树状数组

但,前者编程复杂度较大,而且据说会被卡(没试过);后者理论上超时(据说可以擦边过?);

所以要尝试新的算法;

倒着考虑,显然最后一个对象的位置是最容易确定,顺带着,容易发现,

在第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的更多相关文章

  1. 【POJ2828】Buy Tickets(线段树)

    题意:有一个输入序列,每次操作要把b[i]插入到第a[i]个,在第a[i]个后面的要后移,问最后序列. n<=200000 思路:顺序来只能用splay维护 考虑倒序,对于插入到第K个位置,在线 ...

  2. 【poj2828】Buy Tickets 线段树 插队问题

    [poj2828]Buy Tickets Description Railway tickets were difficult to buy around the Lunar New Year in ...

  3. poj2828 Buy ticket

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

  4. poj2828 BuyTickets 线段树

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 17326   Accepted: 8601 Desc ...

  5. poj2828(线段树查找序列第k小的值)

    题目链接:https://vjudge.net/problem/POJ-2828 题意:有n个人,依次给出这n个人进入队列时前面有多少人p[i],和它的权值v[i],求最终队列的权值序列. 思路:基本 ...

  6. 【poj2182】【poj2828】树状数组/线段树经典模型:逆序查找-空位插入法

    poj2182题意:有一个1~n的排列,现在给定每个人前面有多少个人的编号比他大,求这个排列是什么.n<=8000 poj2182题解: 逆序做,可以确定二分最后一个是什么,然后删除这个数.树状 ...

  7. POJ-2828 Buy Tickets---线段树+逆序

    题目链接: https://cn.vjudge.net/problem/POJ-2828 题目大意: 插队的问题,每个案例给出n,代表有n个插队的,每个给出p,v,意思是代号为v的人插在了第p个人的后 ...

  8. [POJ2828] Buy Tickets(待续)

    [POJ2828] Buy Tickets(待续) 题目大意:多组测试,每组给出\(n\)条信息\((a,b)\),表示\(b\)前面有\(a\)个人,顺序靠后的信息优先级高 Solution.1 由 ...

  9. POJ2828 Buy Tickets[树状数组第k小值 倒序]

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 19012   Accepted: 9442 Desc ...

  10. 【poj2828】Buy Tickets

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

随机推荐

  1. php,javscript调用百地图度API实现标记

    最近一个项目需要用到地图的定位和标记功能,本来考虑使用google map API .但是在国内这个速度确实很慢,有时候加载到一半就出现错了,不过可以通过google agent 来解决在国内的访问速 ...

  2. cxgrid GridMode 等于 True 时的一些问题。

    When using grid mode, the data controller loads a fixed number of dataset records into memory. The n ...

  3. 【刷机】Google Nexus s 蓝牙点击异常,无法启动,刷机解决方案

    1  问题详述 手头上有一部Google Nexus S ,本机自带的输入法不好用,想下载其他的输入法,想用蓝牙传输一下apk文件,点了一下蓝牙开关想要打开蓝牙功能,但奇怪的情况出现了,手机一直重启, ...

  4. linux下使用sqlplus使用上下键显示历史命令

    在linux下使用sqlplus没有在windows下方便,既不好用习惯的退格键,也无法通过上键来显示上一条的命令,这里我们使用rlwrap来解决. 1.安装rlwrap [root@toughhou ...

  5. Keil V5.1x命令“Build Target”重新编译所有文件

    网上的解决办法有多种,但不知道哪一种能对症,以下是我的解决方法:

  6. MVC怎么在同一个action返回两个表的数据

    一般返回一个model这样 @model MvcMusicStore.Models.Album 方法: public ActionResult Details(int id) {            ...

  7. DemoExample

    <HTML> <HEAD> <TITLE>使用递归求解斐波那契数列</TITLE> </HEAD> <BODY> <?ph ...

  8. easyui 多行文本框 Multiline TextBox

    <input class="easyui-textbox" data-options="multiline:true" value="This ...

  9. MVC使用的MetaModel代码生成器模板

    代码生成器能使从一些重复的工作中缓解下来 在最近开发MVC项目中使用到了MetaModel用来设定Model的显示名称,数据限制的代码生成模板,自己第一做代码生成模板还有很多缺陷. 下面是模板代码: ...

  10. struts2+hibernate-jpa+Spring+maven 整合(2)

    1.修改pom.xml 1. 添加  slf4j-api <dependency> <groupId>org.slf4j</groupId> <artifac ...