https://vjudge.net/problem/POJ-2828

题目意思:有n个数,进行n次操作,每次操作有两个数pos, ans。pos的意思是把ans放到第pos 位置的后面,pos后面的数就往后推一位。最后输出每个位置的ans。

思路:根据题 目可知,最后插入的位置的数才是最终不变的数,所以可以从最后的输入作第1个放入,依此类推,倒插入。在插入时也有一定的技术,首先创建一棵空线段树时,每个节点记录当前范围内有多少个空位置。在插入时,要注意,一个数放入之后那么这个位置就不用管了,那么树中所有的空位置就是余下的数所对应的位置,也就是把余下的数又可以看作是一个新的集合。那么每次插入都是当前集合的第1次放。

  1. 1 #include <iostream>
  2. 2 #include <algorithm>
  3. 3 #include <string>
  4. 4 #include <sstream>
  5. 5 #include <set>
  6. 6 #include <vector>
  7. 7 #include <stack>
  8. 8 #include <map>
  9. 9 #include <queue>
  10. 10 #include <deque>
  11. 11 #include <cstdlib>
  12. 12 #include <cstdio>
  13. 13 #include <cstring>
  14. 14 #include <cmath>
  15. 15 #include <ctime>
  16. 16 #include <functional>
  17. 17 // #include <bits/stdc++.h>
  18. 18 using namespace std;
  19. 19
  20. 20 int n,ans[1000000];
  21. 21
  22. 22 struct node
  23. 23 {
  24. 24 int n,val;
  25. 25 }a[1000000];
  26. 26
  27. 27 struct tree
  28. 28 {
  29. 29 int l,r,n;
  30. 30 }b[1000000];
  31. 31
  32. 32 void init()
  33. 33 {
  34. 34 int i,j,k;
  35. 35 for(k=1;k<n;k<<=1);
  36. 36 for(i=k;i<2*k;i++)
  37. 37 {
  38. 38 b[i].l=b[i].r=i-k+1;
  39. 39 b[i].n=1;//每个叶子节点只能放入一个人
  40. 40 }
  41. 41 for(i=k-1;i>0;i--)
  42. 42 {
  43. 43 b[i].l=b[2*i].l;
  44. 44 b[i].r=b[2*i+1].r;
  45. 45 b[i].n=b[2*i].n+b[2*i+1].n;//每个区间是其左右子树所能放入的人数总和
  46. 46 }
  47. 47 }
  48. 48
  49. 49 void insert(int i,int x,int m)
  50. 50 {
  51. 51 if(b[i].l==b[i].r)//找到叶子节点,这个节点存放该人,并且叶子节点能放入的人数清0
  52. 52 {
  53. 53 ans[b[i].l]=m;
  54. 54 b[i].n=0;
  55. 55 return;
  56. 56 }
  57. 57 if(x<=b[2*i].n)//其插入的位置若能放入左子树(还能放人),往左子树放人,否则走右子树
  58. 58 insert(2*i,x,m);
  59. 59 else
  60. 60 insert(2*i+1,x-b[2*i].n,m);
  61. 61 b[i].n--;
  62. 62 }
  63. 63
  64. 64 int main()
  65. 65 {
  66. 66 int i,j;
  67. 67 while(scanf("%d",&n)!=EOF)
  68. 68 {
  69. 69 for(i=1;i<=n;i++)
  70. 70 scanf("%d%d",&a[i].n,&a[i].val);
  71. 71 init();
  72. 72 for(i=n;i>0;i--)//逆推
  73. 73 {
  74. 74 insert(1,a[i].n+1,a[i].val);
  75. 75 }
  76. 76 cout<<ans[1];
  77. 77 for(i=2;i<=n;i++)
  78. 78 cout<<" "<<ans[i];
  79. 79 cout<<endl;
  80. 80 }
  81. 81 return 0;
  82. 82 }

POJ 2828 Buy Tickets(线段树单点)的更多相关文章

  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 (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

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

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

  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 (线段树)

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

  7. POJ - 2828 Buy Tickets (段树单点更新)

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

  8. poj-----(2828)Buy Tickets(线段树单点更新)

    Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissions: 12930   Accepted: 6412 Desc ...

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

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

随机推荐

  1. 《高性能利器》-32张图带你解决RocketMQ所有场景问题

    一.RocketMQ的基本原理 RocketMQ基本架构图如下 从这个架构图上我们可以知道,RocketMQ有4块核心部分: NameServer:管理Broker的信息,让使用MQ的系统感知到集群里 ...

  2. 解决vscode+python不提示numpy函数的问题

    前言 使用vscode编写numpy代码时,对于numpy.array()等方法总是无法提示.查找了很多博客后,大部分都是修改配置和安装多种vscode插件,经过尝试后方法对于我来说无效.最后在调试p ...

  3. go配置私有仓库 (go mod配置私有仓库)

    windows 配置go私有仓库 一.环境 1.私有gitlab (gitlab.xxx.com) 2.go 1.16.3 3.win10系统, 家目录:C:\Users\Administrator, ...

  4. MySQL记录之间是单向链表还是双向链表?

    前言 本文的观点是基于MySQL使用Innodb存储引擎的情况下进行的! 很多渠道说:MySQL数据按照主键大小依次排列,记录之间是双向链表连起来.如果说我告诉你这种说法很大程度上是错的,你肯定说我在 ...

  5. Pytest+Allure 示例

    0. 前言 简介 Allure 框架是一个灵活的.轻量级的.支持多语言的测试报告工具,它不仅以 Web 的方式展示了简介的测试结果,而且允许参与开发过程的每个人可以从日常执行的测试中,最大限度地提取有 ...

  6. maven打包war,导入本地jar包

    方法1: 一 . 在项目根目录创建lib文件夹,把jar放入lib文件夹中 二 . 在项目中使用本地jar pom文件配置如下: <properties> <project.buil ...

  7. C#比较两个对象是否为同一个对象。 Visual Studio调试器指南---多线程应用程序调试(一)

    两个对象是否为同一个对象:是看两个对象是否指向堆中的同一块内存. 1.使用object.ReferenceEquals() class Program { static void Main(strin ...

  8. 安全|常见的Web攻击手段之CSRF攻击

    对于常规的Web攻击手段,如XSS.CRSF.SQL注入.(常规的不包括文件上传漏洞.DDoS攻击)等,防范措施相对来说比较容易,对症下药即可,比如XSS的防范需要转义掉输入的尖括号,防止CRSF攻击 ...

  9. linux下静态库的制作

     在我们编写软件的过程当中,少不了需要使用别人的库函数.因为大家知道,软件是一个协作的工程.作为个人来讲,你不可能一个人完成所有的工作.另外,网络上一些优秀的开源库已经被业内广泛接受,我们也没有必要把 ...

  10. 07.SpringMVC之静态资源

    如何你的DispatcherServlet拦截 *.do这样的URL,就不存在访问不到静态资源的问题.如果你的DispatcherServlet拦截"/",拦截了所有的请求,同时对 ...