POJ2828.Buy Tickets

这个题是插队问题,每次有人插队的时候,其后的所有数据都要进行更新,如果我们反着推,就可以把所有的数据都安排好并且不用再对已插入的数据进行更新,因为逆序处理的话所有的位置都是确定的,第i个人插进来,这个人前面一定有i个空位。逆序遍历一遍查询更新线段树就可以。

这个题简直要写哭了,本来是个基础题,但是我自己的线段树模板的左儿子lson是l,m,右儿子rson是m+1,r,程序直接跑崩了,右儿子改成m,r就可以过,并不是很懂为什么。要了学长的代码,学长写的是我模板那样的,但是我稍微改一下,将update和query合成一个就出问题了,很烦,改代码改了两天,还是不知道为什么,写的我好难过,想哭。难受。

先贴一下rson是m,r的,再贴一下rson是m+1,r的

代码1:

  1. //E
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<algorithm>
  7. #include<cstdlib>
  8. #include<queue>
  9. #include<stack>
  10. using namespace std;
  11. typedef long long ll;
  12. const int inf=0x3f3f3f3f;
  13. const double eps=1e-;
  14. const int maxn=*1e5+;
  15. #define lson l,m,rt<<1
  16. #define rson m,r,rt<<1|1
  17. struct node{
  18. int pos,val;
  19. }a[maxn];
  20.  
  21. int tree[maxn<<],ans[maxn];
  22.  
  23. void build(int l,int r,int rt){
  24. tree[rt]=r-l;
  25. if(tree[rt]==)
  26. return ;
  27.  
  28. int m=(l+r)>>;
  29. build(lson);
  30. build(rson);
  31. }
  32.  
  33. void update(int pos,int val,int l,int r,int rt){
  34. --tree[rt];
  35. if(r-l==){
  36. ans[l]=val;
  37. return ;
  38. }
  39. int m=(l+r)>>;
  40. if(pos<tree[rt<<]) update(pos,val,lson);
  41. else update(pos-tree[rt<<],val,rson);
  42. }
  43.  
  44. int main(){
  45. int n;
  46. while(~scanf("%d",&n)){
  47. for(int i=;i<n;i++)
  48. scanf("%d%d",&a[i].pos,&a[i].val);
  49. build(,n,);
  50. for(int i=n-;i>=;i--)
  51. update(a[i].pos,a[i].val,,n,);
  52. for(int i=;i<n;i++){
  53. if(i==)printf("%d",ans[i]);
  54. else printf(" %d",ans[i]);
  55. }
  56. cout<<endl;
  57. }
  58. return ;
  59. }

代码2:

  1. //自己手贱改一改试试
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cmath>
  5. #include<cstring>
  6. #include<string>
  7. #include<algorithm>
  8. #include<map>
  9. #include<set>
  10. #include<queue>
  11. #include<stack>
  12. #include<sstream>
  13. using namespace std;
  14. #define lson l,m,rt<<1
  15. #define rson m+1,r,rt<<1|1
  16. typedef long long ll;
  17. const int maxn=*1e5+;
  18. const int inf=0x3f3f3f3f;
  19. const int mod=;
  20. const double eps=1e-;
  21. typedef long long ll;
  22. using namespace std;
  23. struct node{
  24. int pos,val;
  25. }a[maxn];
  26. int ans[maxn],vis[maxn];
  27. int tree[maxn<<];
  28. int p,v;
  29. void PushUp(int rt){
  30. tree[rt]=tree[rt<<]+tree[rt<<|];
  31. }
  32. void update(int l,int r,int rt)
  33. {
  34. int m=l+(r-l)/;
  35. if(l==r)tree[rt]+=v;
  36. else
  37. {
  38. if(p<=m)update(lson);
  39. else update(rson);
  40. PushUp(rt);
  41. }
  42. }
  43. int query(int pos,int l,int r,int rt)
  44. {
  45. int m=l+(r-l)/;
  46. if(tree[rt]==pos&&!vis[r])
  47. return r;
  48. if(tree[rt<<]>=pos)
  49. return query(pos,lson);
  50. else
  51. return query(pos-tree[rt<<],rson);
  52. }
  53. int main()
  54. {
  55. int n;
  56. while(~scanf("%d",&n))
  57. {
  58. memset(tree,,sizeof(tree));
  59. memset(vis,,sizeof(vis));
  60. for(int i=;i<n;i++)
  61. {
  62. v=;p=i;
  63. update(,n-,);
  64. }
  65. for(int i=;i<n;i++)
  66. {
  67. scanf("%d%d",&a[i].pos,&a[i].val);
  68. }
  69.  
  70. for(int i=n-;i>=;i--)
  71. {
  72. int ret=query(a[i].pos+,,n-,);
  73. ans[ret]=a[i].val;
  74. vis[ret]=;
  75. v=-;p=ret;
  76. update(,n-,);
  77. }
  78. for(int i=;i<n;i++)
  79. printf("%s%d",i==?"":" ",ans[i]);
  80. printf("\n");
  81. }
  82. return ;
  83. }

这5道线段树的题就先这样吧。

真的是难过,可这就是生活。

POJ 2828.Buy Tickets-完全版线段树(单点更新、逆序遍历查询)的更多相关文章

  1. POJ2828线段树单点更新——逆序更新

    Description 输入n个有序对< pi, vi >,pi表示在第pi个位置后面插入一个值为vi的人,并且pi是不降的.输出最终得到的v的序列 Input 多组用例,每组用例第一行为 ...

  2. HDU 1754.I Hate It-结构体版线段树(单点更新+区间查询最值)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  3. POJ2528线段树段更新逆序异或(广告牌)

    题意:      可以这样理解,有一条直线,然后用n条线段去覆盖,最后问全部都覆盖完之后还有多少是没有被完全覆盖的. 思路:      一开始想的有点偏,想到起点排序,然后..失败了,原因是忘记了题目 ...

  4. hihoCoder #1586 : Minimum-结构体版线段树(单点更新+区间最值求区间两数最小乘积) (ACM-ICPC国际大学生程序设计竞赛北京赛区(2017)网络赛)

    #1586 : Minimum Time Limit:1000ms Case Time Limit:1000ms Memory Limit:256MB Description You are give ...

  5. HDU 1754 I Hate It(线段树单点更新区间最值查询)

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total ...

  6. HDU 1754 I Hate It 线段树(单点更新,成段查询)

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=1754 题解: 单点更新,成段查询. 代码: #include<iostream> ...

  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. 【HTML&CSS】 第二章:标准模式下的页面与怪异模式下的页面区别

    盒模型 前面提到,盒模型(box mode)是浏览器 Quirks Mode 和 Standards Mode 的主要区别. 描述 对于“盒模型”一词并没有明确的文档定义,它是开发人员描述 CSS 中 ...

  2. Scrapy使用示例

    很多网站都提供了浏览者本地的天气信息,这些信息是如何获取到的呢,方法有很多种,大多是利用某些网站提供的天气api获取的,也有利用爬虫采集的.本文就介绍如何用Scrapy来采集天气信息(从新浪天气频道采 ...

  3. python基础——字典dict

    1.概念: (1)字典dict,是一系列的键—值对.每个键key都和一个值value相映射.(字典是python中唯一的映射类型.) (2)每一项item,是一个键值对key—value对. (3)键 ...

  4. 二分查找树按照key值划分

    #include <iostream>#include <vector>#include <algorithm>#include <string>#in ...

  5. warning MSB3162: 所选的“Microsoft Report Viewer 2012 Runtime”项需要“Microsoft.SqlServer.SQLSysClrTypes.11.0”。在“系统必备”对话框中选择缺少的系统必备组件,或者为缺少的系统必备组件创建引导程序包。

    warning MSB3162: 所选的“Microsoft Report Viewer 2012 Runtime”项需要“Microsoft.SqlServer.SQLSysClrTypes.11. ...

  6. CodeForces D. Concatenated Multiples

    http://codeforces.com/contest/1029/problem/D You are given an array aa, consisting of nn positive in ...

  7. 一个自动安装LNMP的简洁Shell脚本

    此脚本在生产服务器上使用了一年多,本脚本崇尚简单唯美,只需要一个脚本就可以在任何一台有网络的服务器上自动配置LNMP.本脚本会在脚本执行目录下,建packages目录用于存放LNMP所需要的软件.大家 ...

  8. Ddos攻击防护

    Ddos攻击防护 首先我们说说ddos攻击方式,记住一句话,这是一个世界级的难题并没有解决办法只能缓解 DDoS(Distributed Denial of Service,分布式拒绝服务)攻击的主要 ...

  9. [codeforces] 526D [51nod] 1554 欧姆诺姆和项链

    原题 KMP 方法一: 听说是ex-kmp--来自学姐 ex-kmp是处理两个串s和t之间,t的每一个后缀在s中的最长前缀的长度的一个算法. 它很像manacher(至少我和学姐这么认为),记录了一个 ...

  10. joyOI 选课 【树形dp + 背包dp】

    题目链接 选课 题解 基础背包树形dp #include<iostream> #include<cstdio> #include<cmath> #include&l ...