/*题意:有n个人,给出n个人要插入的位置与其价值,输出最后的价值*//*【题解】:线段树节点中保存这一段中的空位数,然后倒序对pos插入:例如:  0 771 511 332 69先取: 2 69  ——  ——  —69—   ——   (需要前面有3个空位才能插入)然后取: 1 33   ——   —33—    —69—    ——   (需要前面有2个空位才能插入)然后取: 1 51   ——   —33—    —69—    —51—   (需要前面有2个空位才能插入)  前面只有1个空位  故插入后面空格然后取: 0 77   —77—   —33—    —69—    —51—   (需要前面有1个空位才能插入)
*//*由于左后一个人插进来后他的位置肯定是固定的我们就可以倒着来插,最后一个固定后,如果倒数第二个插入的序号小于当前那么就往前插到序号上,否则往后插,往后的话序号需要减去当前这个数左边的空位数因为左右都是从0位置开始标记的因此结构体里需要维持节点左右边的空位个数,当前插队序号小于左边空位插左边,大于的话插右边,但是需要需要减去左边空位。。因为右边也是从0位置开始算起的,并且我们是倒着插,所以空位个数才是当时的需要插的位置,已经被占的位置当时还不存在..*/#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;struct node
{int l, r, sum;int mark;
}dp[1000005];int p[200005];
int v[200005];
int ans[200005];void Create(int l, int r, int i)
{dp[i].l = l;dp[i].r = r;dp[i].sum = (r - l + 1);if (l == r){return;}int mid = (l + r) >> 1;Create(l, mid, i * 2);Create(mid + 1, r, i * 2 + 1);
}void Change(int a, int b, int i)//a表示空格数量,b为输入的值,i为节点
{if (dp[i].l == dp[i].r){dp[i].sum = 0;ans[dp[i].l] = b;return;}int mid = (dp[i].l + dp[i].r) / 2;//优先放在左边if (a <= dp[i * 2].sum)//如果左边放的下{Change(a, b, i * 2);}else//左边放不下Change(a - dp[i * 2].sum, b, i * 2 + 1);dp[i].sum = dp[i * 2].sum + dp[i * 2 + 1].sum;
}int main()
{int n;while (cin>>n){Create(1, n, 1);for (int i = 0; i < n; i++){scanf("%d%d", &p[i], &v[i]);}for (int i = n - 1; i >= 0; i--){Change(p[i] + 1, v[i], 1);}for (int i = 1; i <= n; i++){if (i != 1){cout << " ";}cout << ans[i];}cout << endl;}return 0;
}

Buy Tickets相关推荐

  1. 【POJ】2828 Buy Tickets(线段树+特殊的技巧/splay)

    http://poj.org/problem?id=2828 一开始敲了个splay,直接模拟. tle了.. 常数太大.. 好吧,说是用线段树.. 而且思想很拽.. (貌似很久以前写过貌似的,,) ...

  2. POJ 2828 Buy Tickets | 线段树的喵用

    题意: 给你n次插队操作,每次两个数,pos,w,意为在pos后插入一个权值为w的数; 最后输出1~n的权值 题解: 首先可以发现,最后一次插入的位置是准确的位置 所以这个就变成了若干个子问题, 所以 ...

  3. poj 2828 Buy Tickets

    http://poj.org/problem?id=2828 题意:在一个队列里,有人依次向第pos个位置插入,求最后的序列: 思路:用线段树存储区间内剩余的没有被占的位置,注意插入的时候要从后向前插 ...

  4. POJ2828 Buy Tickets【线段树,逆序遍历】

    刚开始看到题目,想用memmove偷懒,结果TLE,后来查了查,才发现用memmove也是O(n^2)的复杂度... #include <stdio.h> #include <str ...

  5. POJ 2828 Buy Tickets 线段树

    题目: http://poj.org/problem?id=2828 很巧妙的题,逆序插入线段树,这样元素不用移动.用二叉排序树也能过. 1 #include <stdio.h> 2 #i ...

  6. poj Buy Tickets

    题目链接:http://poj.org/problem?id=2828 类似的题目:http://www.cnblogs.com/lovychen/p/3674048.html 测试数据: in: 4 ...

  7. Buy Tickets(poj 2828)

    题意:排队买票,但是 中途 出现插队情况,比如 0 123,代表值为123的人 插入到 0 的位置,如果后面 出现 0 456,那么新的 0的位置就是 456,123就变成是 1的位置了 分析:这道题 ...

  8. poj-2828 Buy Tickets ***

    线段树 //2828 View Code /* * [这段话转的..] * 如果我们从头开始一次做的话,无论是用链表还是数组,肯定会超时(链表寻址时间长,数组移位时间长.). * 所以要用一个快速的方 ...

  9. POJ - 2828 Buy Tickets(线段树+思维/Splay+模拟)

    题目链接:点击查看 题目大意:给出n个人,一个队列,一开始队列是空的,每个人加入的时候都会插入到指定位置pos的后面,即插队,问最后队列的排列情况是怎么样的 题目分析:一开始很难想到是线段树的题目,毕 ...

  10. #树状数组#poj 2828 Buy Tickets

    题目 输入插队的人和插队的位置,求最终所有人的位置. 分析 树状数组,从后往前(倒推),然后就是要让在前面的次序-1. 代码 #include <cstdio> #include < ...

最新文章

  1. Hibernate获取数据java.lang.StackOverflowError
  2. linux avahi-daemon进程 网络服务 简介
  3. 【修正】销售开票BAPI实例:BAPI_BILLINGDOC_CREATEMULTIPLE
  4. python硬件驱动_Python学习:计算机基础之计算机硬件
  5. php curl拉取远程图片
  6. MySQL sql trace的使用
  7. HTTP---Cookie
  8. 【elasticsearch】 es 路由错误 不到 也可能 查询到的分析
  9. 互联网如何“武装”农民?
  10. Maven传递依赖冲突解决(版本冲突)
  11. TOPOLOGY ADAPTIVE GRAPH CONVOLUTIONAL NETWORKS论文笔记(TAGConv)
  12. Mac之如何将文件夹加入个人收藏
  13. Go语言交叉编译二进制文件
  14. vue-cli创建uni-app项目
  15. python爬取表格指定列_Chrome爬取网页上表格某列的数据
  16. 华为发布BB智能观影产品:Vision Glass
  17. jQuery Pagination分页插件
  18. 笔记四:tif 转 jpg,支持批量
  19. windows终端事件日志监控指南
  20. Office 365之SkyDrive Pro

热门文章

  1. 腾讯面试题(警察捉小偷)
  2. Kafka consumer频繁reblance
  3. html3d上下翻转4面效果,纯CSS 3D翻转一个面(翻转导航菜单 立方体)
  4. 裸眼3D手机的技术原理
  5. linux系统下,gsl 编译问题 -undefined reference to `cblas_xxx`
  6. linux 服务器带宽测试工具
  7. 【转】关于邦迪(J.A. Bondy)的图论教材
  8. java怎么设置按钮居中对齐_button按钮居中
  9. Teleport堡垒机安装部署
  10. 11 【Teleport CSS功能】