题意:给n个人插队,输出最后的队伍情况(题意写的有些粗糙)

思路:第一点:在最后的队伍中,我们唯一能确定的是最后一个人一定能排到指定位置。那么,倒数第二个是在最后一个基础上确定位置的,这样一层一层的倒着确定,所以,我们要逆着放,用二分的方法。

   第二点:将一个插队问题与线段树所所解决的问题进行联系:插到第k个位置也就是前面要留k(0也是一个)个位置(我们先不管这个位置是有有人)那么,是不是将k转化为前面有多少空位子。

     那插这样两个数据呢?

    eg: 2  5

       2  6

就是先优先在二分的前面一段找是否有3个空位子,这样不断的进入每一左段区域的左端,区域就被每次缩小一半,一定会遇到区域内的空位子小于数据的留的空位子,那么就进入左端,同时,减去该区域的左段空位子,(其实,最后有段只是减去了,他本身该站的一个空位子,前面就留了k个空位)

没有图。靠大家想象;

把最核心的代码放这里:(等我把这个搞透,就回来完善)

if (tree[pos << 1].valu >= valu)ind = query((pos << 1), valu);
   else ind = query((pos << 1 | 1), valu - tree[pos << 1].valu);
   tree[pos].valu = tree[pos << 1].valu + tree[pos << 1 | 1].valu;

ac代码如下:

#include<cstdio>
#define MAXN int(2e5)+5
struct node
{
 int l, r, valu;
 int mid(){ return l + ((r - l) >> 1); }
};
int x[MAXN], y[MAXN], n, res[MAXN];
struct Tree
{
 node tree[MAXN << 2];
 void build(int L, int R, int pos)
 {
  tree[pos].l = L; tree[pos].r = R;
  tree[pos].valu = R - L + 1;
  if (L != R)
  {
   int mid = tree[pos].mid();
   build(L, mid, pos << 1);
   build(mid + 1, R, pos << 1 | 1);
  }
 }
 int query(int pos, int valu)
 {
  int L = tree[pos].l, R=tree[pos].r;
  if (L == R)
  {
   tree[pos].valu = 0;
   return L;
  }
  else
  {
   int ind;
   if (tree[pos << 1].valu >= valu)ind = query((pos << 1), valu);
   else ind = query((pos << 1 | 1), valu - tree[pos << 1].valu);
   tree[pos].valu = tree[pos << 1].valu + tree[pos << 1 | 1].valu;
   return ind;
  }
 }
};
Tree tree;
int main()
{
 while (scanf("%d", &n) != EOF)
 {
  tree.build(0, n - 1, 1);
  for (int i = 0; i < n; i++)scanf("%d%d", &x[i], &y[i]);
  for (int i = n - 1; i >= 0; --i)
  {
   int pos = tree.query(1, x[i] + 1);
   res[pos] = y[i];
  }
  for (int i = 0; i < n; i++)
  {
   printf("%d%c", res[i], i == n - 1 ? '\n' : ' ');
  }
 }
 return 0;
}

POJ 2828 Buy Tickets(单点更新) 详细题解和思路的更多相关文章

  1. 线段树(单点更新) POJ 2828 Buy tickets

    题目传送门 /* 结点存储下面有几个空位 每次从根结点往下找找到该插入的位置, 同时更新每个节点的值 */ #include <cstdio> #define lson l, m, rt ...

  2. poj 2828 Buy Tickets 【线段树点更新】

    题目:id=2828" target="_blank">poj 2828 Buy Tickets 题意:有n个人排队,每一个人有一个价值和要插的位置,然后当要插的位 ...

  3. POJ 2828 Buy Tickets(排队问题,线段树应用)

    POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意:  排队买票时候插队.  给出一些数对,分别代表某个人的想要插入的位 ...

  4. poj 2828 Buy Tickets(树状数组 | 线段树)

    题目链接:poj 2828 Buy Tickets 题目大意:给定N,表示有个人,给定每一个人站入的位置,以及这个人的权值,如今按队列的顺序输出每一个人的权值. 解题思路:第K大元素,非常巧妙,将人入 ...

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

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

  6. POJ 2828 Buy Tickets(线段树 树状数组/单点更新)

    题目链接: 传送门 Buy Tickets Time Limit: 4000MS     Memory Limit: 65536K Description Railway tickets were d ...

  7. poj 2828 Buy Tickets【线段树单点更新】【逆序输入】

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 16273   Accepted: 8098 Desc ...

  8. poj 2828 Buy Tickets (线段树 单节点 查询位置更新)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 15533   Accepted: 7759 Desc ...

  9. poj 2828(线段树单点更新)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 18561   Accepted: 9209 Desc ...

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

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

随机推荐

  1. rsync算法原理和工作流程分析

    本文通过示例详细分析rsync算法原理和rsync的工作流程,是对rsync官方技术报告和官方推荐文章的解释.本文不会介绍如何使用rsync命令(见rsync基本用法),而是详细解释它如何实现高效的增 ...

  2. 使用Pabot并行运行RF案例

    一.问题引入 在做接口自动化时随着案例增多,特别是流程类案例增多,特别是asp.net的webform类型的项目,再加上数据库校验也比较耗时,导致RF执行案例时间越来越长,就遇到这样一个问题,705个 ...

  3. python中的函数对象的内存地址是多少

    今天和同学讨论一个问题,发现了函数的内存地址和我想象的不一样. 我以为同一个函数,假如给的参数不一样,那么这两个函数的id就不一样. 然后经过实验,发现python为了便于管理函数,所有的函数都放在同 ...

  4. 深入浅出 JVM GC(4)常用 GC 参数介绍

    # 前言 从前面的3篇文章中,我们分析了5个垃圾收集器,还有一些 GC 的算法,那么,在 GC 调优中,我们肯定会先判断哪里出现的问题,然后再根据出现的问题进行调优,而调优的手段就是 JVM 提供给我 ...

  5. 使用WPF教你一步一步实现连连看(二)

    连连看算法 第一步:我们考虑在同行或者同列的情况: 同行或者同列又分三种情况: 第一:边线,RowNum或者ColNum等于0或者9 第二:两个相邻 第三:同行不相邻,这种事有条件的,所在行(或列)的 ...

  6. 菜鸟入门【ASP.NET Core】7:WebHost的配置、 IHostEnvironment和 IApplicationLifetime介绍、dotnet watch run 和attach到进程调试

    WebHost的配置 我们用vs2017新建一个空网站HelloCore 可以使用ConfigureAppConfiguration对配置进行更改,比如说添加jsonfile和commandline配 ...

  7. CentOS6.5安装mysql以及常见问题的解决

    前言 最近在学习Linux系统,今天在安装MySQL数据库时出现很多问题,花费了两个小时终于解决,故记录下来以供大家参考.(本人目前还在学习阶段,下面写到的是自己结合网上查到的资料以及各位前辈给出的解 ...

  8. 【github&&git】5、使用Git拉取GitLab上的项目

    一.安装Git(windows版.其他平台参阅) 去Git的官网,下载安装包,安装时,一路默认 二.配置Git 2.1 在任意地方,创建一个文件夹,保证该文件夹的目录全部是英文 2.2 打开新建的文件 ...

  9. C code example for strdup

    #include <stdlib.h> #include <stdio.h> #include <string.h> #include <malloc.h&g ...

  10. Linux将未挂载的磁盘挂载到目录

     1.找的未挂载磁盘fdisk -l2.格式化mkfs -t ext4 /dev/xvdc3.挂载目录mount /dev/xvdc /data4.开机启动vi /etc/fstab/dev/xvdc ...