个人心得:线段树的延迟标志确实是减少了很多时间,思想比较简单,但是实现得时候和建立延迟的时候比较麻烦。

按照我的一些理解,就是更新时找到完全覆盖的区间时,更新延迟标志,不再往下更新,但此时父节点啥的都会更新,但是

递归思想到了这里还是会回去,所以在程序末尾进行往上更新就好了,同时,在查询的时候有延迟标志时要下放,

但是注意此时不会影响父节点的值,因为在更新延迟标志的时候就已经回溯把父节点更新了。

题目:

Chinese always have the railway tickets problem because of its' huge amount of passangers and stations. Now goverment need you to develop a new tickets query system. 
One train can just take k passangers. And each passanger can just buy one ticket from station a to station b. Each train cannot take more passangers any time. The one who buy the ticket earlier which can be sold will always get the ticket. 

InputThe input contains servel test cases. The first line is the case number. In each test case: 
The first line contains just one number k( 1 ≤ k ≤ 1000 ) and Q( 1 ≤ Q ≤ 100000 ) 
The following lines, each line contains two integers a and b, ( 1 ≤ a < b ≤ 1000000 ), indicate a query. 
Huge Input, scanf recommanded.OutputFor each test case, output three lines: 
Output the case number in the first line. 
If the ith query can be satisfied, output i. i starting from 1. output an blank-space after each number. 
Output a blank line after each test case.Sample Input

  1. 1
  2. 3 6
  3. 1 6
  4. 1 6
  5. 3 4
  6. 1 5
  7. 1 2
  8. 2 4

Sample Output

  1. Case 1:
  2. 1 2 3 5
  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstring>
  5. #include<iomanip>
  6. #include<algorithm>
  7. using namespace std;
  8. #define inf 1<<29
  9. #define nu 4000005
  10. #define maxnum 1000000
  11. int n,k;
  12. int maxelem;
  13. int book[];
  14. int flag=;
  15. typedef struct
  16. {
  17. int left,right;
  18. int sum;
  19. int jf;
  20. int mid(){
  21. return (left+right)/;
  22. }
  23.  
  24. }Tree;
  25. Tree tree[nu];
  26. void buildtree(int root,int l,int r){
  27. tree[root].left=l,tree[root].right=r;
  28. tree[root].sum=tree[root].jf=;
  29. if(l!=r){
  30. buildtree(root*+,l,(l+r)/);
  31. buildtree(root*+,(l+r)/+,r);
  32. }
  33. }
  34. void updown(int root)
  35. {
  36.  
  37. tree[root*+].jf+=tree[root].jf;
  38. tree[root*+].jf+=tree[root].jf;
  39. tree[root*+].sum+=tree[root].jf;
  40. tree[root*+].sum+=tree[root].jf;
  41. tree[root].jf=;
  42. }
  43. void upset(int root)
  44. {
  45. tree[root].sum=max(tree[root*+].sum,tree[root*+].sum);
  46. }
  47. int checktree(int root,int l,int r)
  48. {
  49. if(tree[root].left==l&&tree[root].right==r)
  50. {
  51. return tree[root].sum;
  52. }
  53. int mid=tree[root].mid();
  54. if(tree[root].jf) updown(root);
  55. if(r<=mid)
  56. return checktree(root*+,l,r);
  57. else if(l>mid)
  58. return checktree(root*+,l,r);
  59. else
  60. {
  61. return max(checktree(root*+,l,mid),checktree(root*+,mid+,r));
  62. }
  63. }
  64. void inserttree(int root,int l,int r){
  65. if(tree[root].left==l&&tree[root].right==r)
  66. {
  67. tree[root].jf+=;
  68. tree[root].sum+=;
  69. return ;
  70. }
  71. int mid=tree[root].mid();
  72. if(tree[root].jf) updown(root);
  73. if(r<=mid)
  74. inserttree(root*+,l,r);
  75. else if(l>mid)
  76. inserttree(root*+,l,r);
  77. else
  78. {
  79. inserttree(root*+,l,mid);
  80. inserttree(root*+,mid+,r);
  81. }
  82. upset(root);
  83. }
  84. int main()
  85. {
  86. int t,j;
  87. scanf("%d",&t);
  88. for(j=;j<=t;j++){
  89. scanf("%d%d",&k,&n);
  90. buildtree(,,maxnum);
  91. flag=;
  92. memset(book,,sizeof(book));
  93. for(int i=;i<=n;i++){
  94. int a,b;
  95. scanf("%d%d",&a,&b);
  96. b--;
  97. if(checktree(,a,b)<k){
  98. book[flag++]=i;
  99. inserttree(,a,b);
  100. }
  101. }
  102. printf("Case %d:\n",j);
  103. for(int p=;p<flag;p++)
  104. {
  105. printf("%d ",book[p]);
  106. }
  107. printf("\n\n");
  108. }
  109. return ;
  110. }
  1.  

Fast Arrangement (线段树,延迟标志)的更多相关文章

  1. HDU - 3577 Fast Arrangement 线段树

    Fast Arrangement Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

  2. HDU 3577 Fast Arrangement (线段树区间更新)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3577 题意不好理解,给你数字k表示这里车最多同时坐k个人,然后有q个询问,每个询问是每个人的上车和下车 ...

  3. HDU 3577 Fast Arrangement ( 线段树 成段更新 区间最值 区间最大覆盖次数 )

    线段树成段更新+区间最值. 注意某人的乘车区间是[a, b-1],因为他在b站就下车了. #include <cstdio> #include <cstring> #inclu ...

  4. hdu 3577 Fast Arrangement(线段树区间修改,求区间最小值)

    Problem Description Chinese always have the railway tickets problem because of its' huge amount of p ...

  5. zoj 1610 Count the Colors(线段树延迟更新)

    所谓的懒操作模板题. 学好acm,英语很重要.做题的时候看不明白题目的意思,我还拉着队友一块儿帮忙分析题意.最后确定了是线段树延迟更新果题.我就欣欣然上手敲了出来. 然后是漫长的段错误.... 第一次 ...

  6. hdu 5023 线段树延迟更新+状态压缩

    /* 线段树延迟更新+状态压缩 */ #include<stdio.h> #define N 1100000 struct node { int x,y,yanchi,sum; }a[N* ...

  7. HDU 3468:A Simple Problem with Integers(线段树+延迟标记)

    A Simple Problem with Integers Case Time Limit: 2000MS Description You have N integers, A1, A2, ... ...

  8. codevs 1690 开关灯 线段树+延迟标记

    1690 开关灯  时间限制: 1 s  空间限制: 128000 KB   题目描述 Description YYX家门前的街上有N(2<=N<=100000)盏路灯,在晚上六点之前,这 ...

  9. Tree(树链剖分+线段树延迟标记)

    Tree http://poj.org/problem?id=3237 Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 12 ...

  10. HDU4893--Wow! Such Sequence! (线段树 延迟标记)

    Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Oth ...

随机推荐

  1. 【Python】常用内建模块(卒)

    内容来自廖雪峰的官方网站 笔记性质 1.datetime 2.collections 3.base64 4.struct 5.hashlib 6.itertools 7.contextlib 8.XM ...

  2. MapReduce:将下面的两排数字先按第一排排序,然后再按第二排排序,要求顺序排序

    MapReduce:将下面的两排数字先按第一排排序,然后再按第二排排序,要求顺序排序 文件如下: 这个案例主要考察我们对排序的理解,我们可以这样做: 代码如下(由于水平有限,不保证完全正确,如果发现错 ...

  3. LOJ 一本通一句话题解系列:

    第一部分 基础算法 第 1 章 贪心算法 1):「一本通 1.1 例 1」活动安排:按照结束时间排序,然后扫一遍就可以了. 2):「一本通 1.1 例 2」种树:首先要尽量的往区间重叠的部分种树,先按 ...

  4. xp_sp3_pro_简中_x86_cd_vl_x14-74070

    1.镜像文件: zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso 来自 msdn itellyou ...

  5. Eclipse下建立简单JNI程序实现返回double类型

    在Eclipse下生成时要注意,由于通常是在package里面添加类,而非像单独建立工程时独立添加,所以,在编译的时候,都需要进入包所在的文件夹, javac 包名.类名 这样的形式来编译,同理,ja ...

  6. day5-xml模块

    一.简述 xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.它用于不同语言或者程序之间进行数据交换,从这点上讲与json差不多,只不过json看 ...

  7. Node.js小白开路(一)-- Buffer篇

    Buffer是nodeJS中的二进制缓存操作模块内容.先来看一段简短的代码. // 创建一个长度为 10.且用 0 填充的 Buffer. const buf1 = Buffer.alloc(10); ...

  8. 启动代码之开iCache

    1.什么是cache,有什么用    cache是一种内存,叫高速缓存.从容量来说:CPU < 寄存器 < cache < DDR从速度来说:CPU > 寄存器 > ca ...

  9. a标签设置锚点定位div

    <a href="#5F">锚点5</a> </br></br></br></br></br>& ...

  10. Linux系统下的shutdown命令用于安全的关闭/重启计算机

    Linux系统下的shutdown命令用于安全的关闭/重启计算机,它不仅可以方便的实现定时关机,还可以由用户决定关机时的相关参数.在执行shutdown命令时,系统会给每个终端(用户)发送一条屏显,提 ...