题目链接:http://poj.org/problem?id=2828

题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的。

反过来做就很容易了,从最后一个人开始推,最后一个人位置很容易就确定了,那最后第二个人的位置也可以推(与最后一个人的位置无关)...依次就都可以确定所有的人了。

用前缀和的思想,要是这个人的位置确定了,那么就标记这个人位置的值为0,然后回溯更新,跟求逆序对个数的思想比较类似。

线段树:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 2e5 + ;
struct segtree {
int l , r , val;
}T[MAXN << ];
int x[MAXN] , y[MAXN] , ans[MAXN] , id; void init(int p , int l , int r) {
T[p].l = l , T[p].r = r;
int mid = (l + r) >> ;
if(l == r) {
T[p].val = ;
return ;
}
init(p << , l , mid);
init((p << )| , mid + , r);
T[p].val = T[p << ].val + T[(p << )|].val;
} void updata(int p , int num) {
int mid = (T[p].l + T[p].r) >> ;
if(T[p].l == T[p].r) {
T[p].val = ;
id = T[p].l;
return ;
}
if(num <= T[p << ].val) {
updata(p << , num);
}
else {
updata((p << )| , num - T[p << ].val);
}
T[p].val = T[p << ].val + T[(p << )|].val;
} int main()
{
int n;
while(~scanf("%d" , &n)) {
init( , , n);
for(int i = ; i < n ; i++) {
scanf("%d %d" , x + i , y + i);
x[i]++;
}
for(int i = n - ; i >= ; i--) {
updata( , x[i]);
ans[id] = y[i];
}
for(int i = ; i < n ; i++) {
printf("%d " , ans[i]);
}
printf("%d\n" , ans[n]);
}
}

树状数组+二分:

 #include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int MAXN = 2e5 + ;
int bit[MAXN] , n , x[MAXN] , y[MAXN] , ans[MAXN]; inline void add(int i , int num) {
for( ; i <= n ; i += (i & -i)) {
bit[i] += num;
}
} int sum(int i) {
int s = ;
for( ; i > ; i -= (i & -i))
s += bit[i];
return s;
} int main()
{
while(~scanf("%d" , &n)) {
memset(bit , , sizeof(bit));
for(int i = ; i <= n ; i++) {
scanf("%d %d" , x + i , y + i);
x[i]++;
add(i , );
}
for(int i = n ; i >= ; i--) {
int l = , r = n , mid;
while(l < r) {
mid = (l + r) >> ;
if(sum(mid) >= x[i])
r = mid;
else
l = mid + ;
}
ans[l] = y[i];
add(l , -);
}
for(int i = ; i < n ; i++) {
printf("%d " , ans[i]);
}
printf("%d\n" , ans[n]);
}
}

POJ 2828 Buy Tickets (线段树 or 树状数组+二分)的更多相关文章

  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 线段树 倒序插入 节点空位预留(思路巧妙)

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

  3. poj 2828 Buy Tickets (线段树)

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

  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(排队问题,线段树应用)

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

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

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

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

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

随机推荐

  1. C/C++内存存储

    #include <stdio.h> #include "string.h" #include "malloc.h" void Swap(int a ...

  2. bzoj2801

    也就是一堆方程,每个方程都形如xi+xj=P 模拟代入消元即可,并且求出取值范围 遇到环就可以直接解出来,判断是否可行 由于这题比较坑爹,读入太大会RE,要cheat,就不放代码了

  3. apache开源项目 --Struts

    struts简介 Struts是Apache软件基金会(ASF)赞助的一个开源项目.它最初是jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目.它通过采用JavaServlet/ ...

  4. w3c盒子模型与ie盒子模型

    盒子模型是css的专有名词,用来描述页面设置中的各种属性,如内容(content).填充(padding).边框(border).边界(margin),由于这些属性拼在一起,与日常生活中的“盒子”很相 ...

  5. java web 学习十一(使用cookie进行会话管理)

    一.会话的概念 会话可简单理解为:用户开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. 有状态会话:一个同学来过教室,下次再来教室,我们会知道这个同学曾 ...

  6. 细雨学习笔记:Jmeter参数化

    目前我用到两种方式: 1)某个参数,值不常改变的,好多地方都用到:请用“用户定义的变量” 用户组,右键--添加--配置原件--用户定义的变量,在这添加. 如何使用呢?在需要用到此参数的地方这样引用: ...

  7. Jemeter对Oracle数据库性能测试方法

    下载Oracle的jdbc数据库驱动包,注意Oracle数据库的版本,这里使用的是:Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 ...

  8. 提取数字、英文、中文、过滤重复字符等SQL函数(含判断字段是否有中文)

    --SQL 判断字段值是否有中文 create  function  fun_getCN(@str  nvarchar(4000))    returns  nvarchar(4000)      a ...

  9. maven学习系列第二课,关于springmvc的pop.xml的依赖的添加

    不说废话了,图的书序就是操作顺序 1. 2.

  10. 【原】Mongodb相关资料

    Mongodb与关系型数据库对比 Mongodb与关系型数据库对比 由于之前主要接触的是关系型数据库,所以主要将Mongodb与关系型数据库进行对比:主要从术语.Server与Client.数据定义语 ...