这道题也有点新意,就是须要记录最小值段和最大值段,然后成段更新这个段,而不用没点去更新,达到提快速度的目的。

本题过的人非常少,由于大部分都超时了,我严格依照线段树的方法去写。一開始竟然也超时。

然后修补了两个地方就过了,详细改动的地方请參看程序。

知道最大值段和最小值段,然后修补一下就能过了。不是特别难的题目。

  1. #include <stdio.h>
  2. #include <string>
  3. #include <algorithm>
  4. using namespace std;
  5.  
  6. const int SIZE = 200002;
  7. const int TREESIZE = SIZE + (SIZE<<1);
  8. int N, M, P;
  9. int segTree[TREESIZE];
  10. int smallest[TREESIZE];
  11. int largest[TREESIZE];
  12.  
  13. inline int lChild(int rt) { return rt<<1; }
  14. inline int rChild(int rt) { return rt<<1|1; }
  15.  
  16. void build(int l, int r, int rt)
  17. {
  18. segTree[rt] = 0;
  19. smallest[rt] = 0;
  20. largest[rt] = 0;
  21. if (l == r) return ;
  22.  
  23. int m = l + ((r-l)>>1);
  24. build(l, m, lChild(rt));
  25. build(m+1, r, rChild(rt));
  26. }
  27.  
  28. inline void pushUp(int rt)
  29. {
  30. smallest[rt] = min(smallest[lChild(rt)], smallest[rChild(rt)]);
  31. largest[rt] = max(largest[lChild(rt)], largest[rChild(rt)]);
  32. }
  33.  
  34. inline void pushDown(int rt)
  35. {
  36. if(segTree[rt])
  37. {
  38. int l = lChild(rt), r = rChild(rt);
  39. largest[l] += segTree[rt];
  40. largest[r] += segTree[rt];
  41. smallest[l] += segTree[rt];
  42. smallest[r] += segTree[rt];
  43. segTree[l] += segTree[rt];
  44. segTree[r] += segTree[rt];
  45. segTree[rt] = 0;
  46. }
  47. }
  48.  
  49. void update(int L, int R, int val, int l, int r, int rt)
  50. {
  51. if (L <= l && r <= R)
  52. {
  53. if(largest[rt] < P)
  54. {
  55. smallest[rt] += val;
  56. largest[rt] += val;
  57. segTree[rt] += val;
  58. return ;
  59. }
  60. if(smallest[rt] >= P)
  61. {
  62. smallest[rt] += val<<1;
  63. largest[rt] += val<<1;
  64. segTree[rt] += val<<1;
  65. return;
  66. }
  67. }
  68.  
  69. //if (r < L || R < l) return;//在这里推断也会超时
  70. pushDown(rt);
  71.  
  72. int m = l + ((r-l)>>1);
  73. if (L <= m) update(L, R, val, l, m, lChild(rt));
  74. if (m < R) update(L, R, val, m+1, r, rChild(rt));
  75.  
  76. pushUp(rt);
  77. }
  78.  
  79. inline void pushDown_2(int rt)
  80. {
  81. if (segTree[rt])
  82. {
  83. segTree[lChild(rt)] += segTree[rt];
  84. segTree[rChild(rt)] += segTree[rt];
  85. }
  86. }
  87.  
  88. void printTree(int l, int r, int rt)
  89. {
  90. if (l == r)
  91. {
  92. if (l != N) printf("%d ", segTree[rt]);
  93. else printf("%d\n", segTree[rt]);
  94. return ; //记得返回。
  95. }
  96. pushDown_2(rt);
  97.  
  98. int m = l + ((r-l)>>1);
  99. printTree(l, m, lChild(rt));
  100. printTree(m+1, r, rChild(rt));
  101. }
  102.  
  103. int main()
  104. {
  105. int a, b, c;
  106. while (scanf("%d %d %d", &N, &M, &P) != EOF)
  107. {
  108. build(1, N, 1);
  109. //memset(largest, 0, sizeof(largest)); 这样写反而超时
  110. //memset(smallest, 0, sizeof(smallest));
  111. //memset(segTree, 0, sizeof(segTree));
  112. while (M--)
  113. {
  114. scanf("%d %d %d", &a, &b, &c);
  115. update(a, b, c, 1, N, 1);
  116. }
  117. printTree(1, N, 1);
  118. }
  119. return 0;
  120. }

HDU 4107 Gangster Segment Tree线段树的更多相关文章

  1. SPOJ 11840. Sum of Squares with Segment Tree (线段树,区间更新)

    http://www.spoj.com/problems/SEGSQRSS/ SPOJ Problem Set (classical) 11840. Sum of Squares with Segme ...

  2. Implementation:Segment Tree 线段树

    早就听人提起过线段树,今天有题搞不出来,讨论上说要用一下线段树,看了下,本质上是空间划分索引,只不过是一维上面的,如果在二维则是四叉树,三维则是八叉树,如果可以动态调整那么跟R-Tree就很相似了,他 ...

  3. HDU.5692 Snacks ( DFS序 线段树维护最大值 )

    HDU.5692 Snacks ( DFS序 线段树维护最大值 ) 题意分析 给出一颗树,节点标号为0-n,每个节点有一定权值,并且规定0号为根节点.有两种操作:操作一为询问,给出一个节点x,求从0号 ...

  4. HDU.1556 Color the ball (线段树 区间更新 单点查询)

    HDU.1556 Color the ball (线段树 区间更新 单点查询) 题意分析 注意一下pushdown 和 pushup 模板类的题还真不能自己套啊,手写一遍才行 代码总览 #includ ...

  5. HDU.1166 敌兵布阵 (线段树 单点更新 区间查询)

    HDU.1166 敌兵布阵 (线段树 单点更新 区间查询) 题意分析 加深理解,重写一遍 代码总览 #include <bits/stdc++.h> #define nmax 100000 ...

  6. HDU 3016 Man Down (线段树+dp)

    HDU 3016 Man Down (线段树+dp) Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Ja ...

  7. HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对)

    HDU.1394 Minimum Inversion Number (线段树 单点更新 区间求和 逆序对) 题意分析 给出n个数的序列,a1,a2,a3--an,ai∈[0,n-1],求环序列中逆序对 ...

  8. HDU.1689 Just a Hook (线段树 区间替换 区间总和)

    HDU.1689 Just a Hook (线段树 区间替换 区间总和) 题意分析 一开始叶子节点均为1,操作为将[L,R]区间全部替换成C,求总区间[1,N]和 线段树维护区间和 . 建树的时候初始 ...

  9. hdu 1754 I Hate It 线段树 点改动

    // hdu 1754 I Hate It 线段树 点改动 // // 不多说,裸的点改动 // // 继续练 #include <algorithm> #include <bits ...

随机推荐

  1. 命令行导入SQL文件

    摘要:把数据库导出为XX.sql格式的数据库文件,导入到另外一个数据库中的时候,总是无法全部导入.及时用mysql的命令界面导入依然是无法全部导入.老师告诉我:在命令行中运行的效率和成功率是最快和最高 ...

  2. 【书海】《Head First Java》 ——读后总结

    <Head First Java> 中文版 (第二版) IT`huhui前言录 <Head First Java>这本书我不算特别细的看了一遍.认为十分适合初学者,甚至是没接触 ...

  3. APUE1

    [APUE]进程控制(上)   一.进程标识 进程ID 0是调度进程,常常被称为交换进程(swapper).该进程并不执行任何磁盘上的程序--它是内核的一部分,因此也被称为系统进程.进程ID 1是in ...

  4. 个性二维码开源专题<替换定位点>

    基础方法: ChangeFillShape //修改填充形状 ChangeFillShape(...) // 摘要: // 修改填充形状 // // 参数: // g: // 图形画板 // // F ...

  5. jenkins插件 build timeout和build timestamp

    build timeout plugin, 允许对job设置timeout时间,当超时时,job将abort. build timestamp pluin,使得job log的每次输出前面都增加当时的 ...

  6. Cmd命令

    write----------写字板 mspaint--------画图板 mobsync--------同步命令 eudcedit-------造字程序 dvdplay--------DVD播放器 ...

  7. junit批量测试

    引入一种“测试套件”的概念: package test; import org.junit.Test; public class Test1 { private int value = 1; publ ...

  8. proj01总结:spring jdbc操作

    commons-collections.jar: Apache Commons包中的一个,包含了一些Apache开发的集合类,功能比java.util.*强大.必须使用的jar包. commons-l ...

  9. ios 项目里常用的宏

    NSLog(@"__func__ :  %s", __func__);//oc测试环境,打印文件名,方法名 NSLog(@"__FUNCTION__ : %s" ...

  10. 【Android】Android内存机制,了解Android堆和栈

    1.dalvik的Heap和Stack 这里说的只是dalvik java部分的内存,实际上除了dalvik部分,还有native.     下面针对上面列出的数据类型进行说明,只有了解了我们申请的数 ...