题意:Q是询问区间和,C是在区间内每个节点加上一个值

Sample Input

10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output

4
55
9
15

  1. # include <iostream>
  2. # include <cstdio>
  3. # include <cstring>
  4. # include <algorithm>
  5. # include <cmath>
  6. # include <queue>
  7. # define LL long long
  8. using namespace std ;
  9.  
  10. const int maxn = ;
  11.  
  12. LL sum[maxn<<] ; //结点开4倍
  13. LL add[maxn<<] ; //延迟标记
  14.  
  15. void PushUP(int rt) //更新到父节点
  16. {
  17. sum[rt] = sum[rt * ] + sum[rt * + ] ; //rt 为当前结点
  18. }
  19.  
  20. void PushDown(int rt , int m ) //向下更新
  21. {
  22. if (add[rt])
  23. {
  24. add[rt * ] += add[rt] ;
  25. add[rt * + ] += add[rt] ;
  26. sum[rt * ] += (m - m / ) * add[rt] ;
  27. sum[rt * + ] += (m / ) * add[rt] ;
  28. add[rt] = ;
  29. }
  30. }
  31.  
  32. void build(int l , int r , int rt) //构建线段树
  33. {
  34. add[rt] = ;
  35. if (l == r)
  36. {
  37. cin>>sum[rt];
  38. return ;
  39. }
  40. int m = (l + r) / ;
  41. build(l , m , rt * ) ;
  42. build(m + , r , rt * +) ;
  43. PushUP(rt) ;
  44. }
  45.  
  46. void updata(int L , int R , int c , int l , int r , int rt) //成段增减
  47. {
  48. if (L <= l && r <= R)
  49. {
  50. add[rt] += c ;
  51. sum[rt] += (r - l + ) * c ;
  52. return ;
  53. }
  54. PushDown(rt , r - l + ) ;
  55. int m = (l + r) / ;
  56.  
  57. if (L <= m)
  58. updata(L , R , c , l , m , rt * ) ;
  59. if (R > m)
  60. updata(L , R , c , m + , r , rt * + ) ;
  61. PushUP(rt) ;
  62. }
  63.  
  64. LL query(int L , int R , int l , int r , int rt) //区间求和
  65. {
  66. if (L <= l && r <= R)
  67. return sum[rt] ;
  68. PushDown(rt , r - l + ) ;
  69. int m = (l + r) / ;
  70. LL ret = ;
  71. if (L <= m)
  72. ret += query(L , R , l , m , rt * ) ;
  73. if (R > m)
  74. ret += query(L , R , m + , r , rt * + ) ;
  75. return ret ;
  76. }
  77.  
  78. int main ()
  79. {
  80. //freopen("in.txt","r",stdin) ;
  81. int n , m ;
  82. scanf("%d %d" , &n , &m) ;
  83.  
  84. build( , n , ) ;
  85. while(m--)
  86. {
  87. char op[] ;
  88. int a , b , c ;
  89. scanf("%s" , op) ;
  90. if(op[] == 'Q')
  91. {
  92. scanf("%d %d" , &a , &b) ;
  93. cout<<query(a , b , , n , )<<endl ;
  94. }
  95. else
  96. {
  97. scanf("%d %d %d" , &a , &b , &c) ;
  98. updata(a , b , c , , n , ) ;
  99. }
  100. }
  101.  
  102. return ;
  103. }

poj 3468 线段树 成段增减 区间求和的更多相关文章

  1. POJ 3468 A Simple Problem with Integers(线段树 成段增减+区间求和)

    A Simple Problem with Integers [题目链接]A Simple Problem with Integers [题目类型]线段树 成段增减+区间求和 &题解: 线段树 ...

  2. POJ 3468 线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

  3. poj 3669 线段树成段更新+区间合并

    添加 lsum[ ] , rsum[ ] , msum[ ] 来记录从左到右的区间,从右到左的区间和最大的区间: #include<stdio.h> #define lson l,m,rt ...

  4. poj 3468 线段树成段更新

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 54012   ...

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

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

  6. poj 3648 线段树成段更新

    线段树成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候.延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当 ...

  7. 线段树---poj3468 A Simple Problem with Integers:成段增减:区间求和

    poj3468 A Simple Problem with Integers 题意:O(-1) 思路:O(-1) 线段树功能:update:成段增减 query:区间求和 Sample Input 1 ...

  8. POJ训练计划2777_Count Color(线段树/成段更新/区间染色)

    解题报告 题意: 对线段染色.询问线段区间的颜色种数. 思路: 本来直接在线段树上染色,lz标记颜色.每次查询的话訪问线段树,求出颜色种数.结果超时了,最坏的情况下,染色能够染到叶子节点. 换成存下区 ...

  9. C - A Simple Problem with Integers POJ - 3468 线段树模版(区间查询区间修改)

    参考qsc大佬的视频 太强惹 先膜一下 视频在b站 直接搜线段树即可 #include<cstdio> using namespace std; ; int n,a[maxn]; stru ...

随机推荐

  1. TCP协议 连接三次握手

    TCP(Transmission Control Protocol) 传输控制协议 TCP是主机对主机层的传输控制协议,提供可靠的连接服务,采用三次握手确认建立一个连接: 位码即tcp标志位,有6种标 ...

  2. oracle 每个类别取几条的语法怎么写

    select *from (select t.*,row_number() over(partition by t.公司名 order by 1) rn  from t)where rn<=10

  3. 【题解】 [HNOI2009] 最小圈 (01分数规划,二分答案,负环)

    题目背景 如果你能提供题面或者题意简述,请直接在讨论区发帖,感谢你的贡献. 题目描述 对于一张有向图,要你求图中最小圈的平均值最小是多少,即若一个圈经过k个节点,那么一个圈的平均值为圈上k条边权的和除 ...

  4. 【Vijos1404】遭遇战(最短路)

    [Vijos1404]遭遇战(最短路) 题面 Vijos 题解 显然可以树状数组之类的东西维护一下\(dp\).这里考虑一种最短路的做法. 首先对于一个区间\([l,r]\),显然可以连边\((l,r ...

  5. BZOJ4589 Hard Nim(快速沃尔什变换FWT)

    这是我第一道独立做出来的FWT的题目,所以写篇随笔纪念一下. (这还要纪念,我太弱了) 题目链接: BZOJ 题目大意:两人玩nim游戏(多堆石子,每次可以从其中一堆取任意多个,不能操作就输).$T$ ...

  6. debian开启cgroup memory子系统

    Debian系统默认是关闭cgroup memory子系统的. 1.修改grub启动参数 # vim /etc/default/grub GRUB_CMDLINE_LINUX="cgroup ...

  7. 用rem来做响应式开发(转)

    由于最近在做公司移动项目的重构,因为要实现响应式的开发,所以大量使用到了rem的单位,觉得这个单位有点意思.但是现在貌似用他的人很少.上一篇文章我分享了淘宝写的一篇rem的介绍,介绍的非常全面,但是他 ...

  8. JSON.parseObject(String str)与JSONObject.parseObject(String str)的区别

    一.首先来说说fastjson fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发.其主要特点是: ① 快速:fastjson采用独创的算法, ...

  9. ubuntu,centor 安装apache bench

    ab全称为:apache bench. 是apache自带的压力测试工具.ab非常实用,它不仅可以对apache服务器进行网站访问压力测试,也可以对或其它类型的服务器进行压力测试.比如nginx.to ...

  10. 使用pandas导入csv文件到MySQL

    之前尝试过用命令行来解决csv文件导入到MySQL这个问题,没想到一直没有成功.之后会继续更新的吧,现在先用pandas来解决这个问题,虽然会复杂一点,但至少能用. 例子是导入movielens的ra ...