POJ 2828 Buy Tickets(单点更新) 详细题解和思路
题意:给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(单点更新) 详细题解和思路的更多相关文章
- 线段树(单点更新) POJ 2828 Buy tickets
题目传送门 /* 结点存储下面有几个空位 每次从根结点往下找找到该插入的位置, 同时更新每个节点的值 */ #include <cstdio> #define lson l, m, rt ...
- poj 2828 Buy Tickets 【线段树点更新】
题目:id=2828" target="_blank">poj 2828 Buy Tickets 题意:有n个人排队,每一个人有一个价值和要插的位置,然后当要插的位 ...
- POJ 2828 Buy Tickets(排队问题,线段树应用)
POJ 2828 Buy Tickets(排队问题,线段树应用) ACM 题目地址:POJ 2828 Buy Tickets 题意: 排队买票时候插队. 给出一些数对,分别代表某个人的想要插入的位 ...
- poj 2828 Buy Tickets(树状数组 | 线段树)
题目链接:poj 2828 Buy Tickets 题目大意:给定N,表示有个人,给定每一个人站入的位置,以及这个人的权值,如今按队列的顺序输出每一个人的权值. 解题思路:第K大元素,非常巧妙,将人入 ...
- poj 2828 Buy Tickets (线段树(排队插入后输出序列))
http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissio ...
- POJ 2828 Buy Tickets(线段树 树状数组/单点更新)
题目链接: 传送门 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Description Railway tickets were d ...
- poj 2828 Buy Tickets【线段树单点更新】【逆序输入】
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 16273 Accepted: 8098 Desc ...
- poj 2828 Buy Tickets (线段树 单节点 查询位置更新)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 15533 Accepted: 7759 Desc ...
- poj 2828(线段树单点更新)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 18561 Accepted: 9209 Desc ...
- POJ 2828 Buy Tickets 线段树 倒序插入 节点空位预留(思路巧妙)
Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissions: 19725 Accepted: 9756 Desc ...
随机推荐
- 使用Asp.Net Core MVC 开发项目实践[第一篇:项目结构说明]
先从下图看整体项目结构: Mango.Manager: 为后台管理项目 Mango.Web: 为前台项目 Mango.Framework.Core: 为常用的基础操作类项目 Mango.Framewo ...
- Java技术开发中的坑
1.(2014/05/28)struts2中使用eclipse自动获取getter和setter方法的坑 今天着实被eclipse坑了一把,平时遇到get和set方法时,我都是通过eclipse自动生 ...
- Task.Run Vs Task.Factory.StartNew 【收藏】
在.Net 4中,Task.Factory.StartNew是启动一个新Task的首选方法.它有很多重载方法,使它在具体使用当中可以非常灵活,通过设置可选参数,可以传递任意状态,取消任务继续执行,甚至 ...
- ModBus通信协议的【Modbus RTU 协议使用汇总】
1.RTU模式 当控制器设为在Modbus网络上以RTU(远程终端单元)模式通信,在消息中的每个8Bit字节包含两个4Bit的十六进制字符.这种方式的主要优点是:在同样的波特率下,可比ASCII方式传 ...
- SQL Server Service Broker(简称SSB)资料
SQL server Service Broker (下面简称SSB) 是SQL server 里面比较独特的一个功能.它可帮助开发人员构建异步的松散耦合应用程序.SSB的一些功能和好处包括有: 数据 ...
- 以杨辉三角为例,从内存角度简单分析C语言中的动态二维数组
学C语言,一定绕不过指针这一大难关,而指针最让人头疼的就是各种指向关系,一阶的指针还比较容易掌握,但一旦阶数一高,就很容易理不清楚其中的指向关系,现在我将通过杨辉三角为例,我会用四种方法从内存的角度简 ...
- 【Java并发编程】14、Thread,线程说明
线程的状态:New.Runnable.Blocked.Waiting.Timed waiting.Terminated 1. RUNNABLE,对应"就绪"和"运行&qu ...
- 【Servlet】1、Servlet监听器及相关接口
Servlet监听器用于监听一些重要事件的发生,监听器对象可以在事情发生前.发生后可以做一些必要的处理. 接口: 目前Servlet2.4和JSP2.0总共有8个监听器接口和6个Event类,其中Ht ...
- Nginx负载均衡配置调优
worker_processes ; error_log logs/error.log crit; #日志位置和日志级别 pid logs/nginx.pid; worker_rlimit_nofil ...
- 【读书笔记】iOS-iOS开发之iOS程序偏好设置(Settings Bundle)的使用
在Android手机上, 在某个程序里,通过按Menu键,一般都会打开这个程序的设置,而在iOS里,系统提供了一个很好的保存程序设置的机制.就是使用Settings Bundle. 在按了HOME键的 ...