题目链接

这个真费劲。。。其实我也不懂 为什么。。。大体思想是,如果把区间更新了,开始的时候只把用懒惰标记标记那个区间,而不更新底层元素,而如果查询的时候顺带着把lz标记给消除。。。多敲几遍,多调试一下,看看中间过程,就应该理解了。

 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <stdlib.h>
 4 #define N 100001
 5 #define ll __int64
 6 ll p[4*N],lz[4*N];
 7 void pushup(int rt)
 8 {
 9     p[rt] = p[rt<<1]+p[rt<<1|1];
10 }
11 void pushdown(int rt,int m)//消除懒惰标记,m记录区间长度
12 {
13     if(lz[rt])
14     {
15         lz[rt<<1] += lz[rt];//把他传递给儿子们
16         lz[rt<<1|1] += lz[rt];
17         p[rt<<1] += lz[rt]*(m - (m>>1));//更新线段树上的元素,注意位运算优先级的比较低啊!!
18         p[rt<<1|1] += lz[rt]*(m>>1);
19         lz[rt] = 0;//消除标记
20     }
21 }
22 void build(int l,int r,int rt)//建树
23 {
24     int m;
25     lz[rt] = 0;
26     if(l == r)
27     {
28         scanf("%I64d%*c",&p[rt]);
29         return ;
30     }
31     m = (l+r)>>1;
32     build(l,m,rt<<1);
33     build(m+1,r,rt<<1|1);
34     pushup(rt);
35 }
36 ll query(int L,int R,int l,int r,int rt)//L,R表示最后查询的区间。l,r表示中间过程历遍的区间。
37 {
38     int m;
39     ll sum = 0;
40     if(l >= L&&r <= R)
41     {
42         return p[rt];//如果l-r在L-R之间的话,直接返回
43     }
44     pushdown(rt,r - l + 1);//消除懒惰标记
45     m = (l + r) >> 1;
46     if(L <= m)//查找
47         sum += query(L,R,l,m,rt<<1);
48     if(R > m)
49         sum += query(L,R,m+1,r,rt<<1|1);
50     return sum;
51 }
52 void update(int L,int R,int l,int r,int rt,int sc)
53 {
54     int m;
55     if(l >= L&&r <= R)
56     {
57         lz[rt] += sc;//标记懒惰
58         p[rt] += sc*(r - l + 1);
59         return ;
60     }
61     pushdown(rt,r-l+1);
62     m = (l + r) >> 1;
63     if(L <= m) update(L,R,l,m,rt<<1,sc);
64     if(R > m) update(L,R,m+1,r,rt<<1|1,sc);
65     pushup(rt);
66 }
67 int main()
68 {
69     int n,m,i,x,y,z;
70     char str[10];
71     scanf("%d%d",&n,&m);
72     build(1,n,1);
73     for(i = 1; i <= m; i ++)
74     {
75         scanf("%s%d%d%*c",str,&x,&y);
76         if(str[0] == 'Q')
77         {
78             printf("%I64d\n",query(x,y,1,n,1));
79         }
80         else if(str[0] == 'C')
81         {
82             scanf("%d%*c",&z);
83             update(x,y,1,n,1,z);
84         }
85     }
86     return 0;
87 }

转载于:https://www.cnblogs.com/naix-x/archive/2012/08/10/2632079.html

POJ 3468 A Simple Problem with Integers(线段树区间更新)相关推荐

  1. poj 3468 A Simple Problem with Integers(线段树区区)

    题目链接:  http://poj.org/problem?id=3468 题目大意:  给出N个数,和M次查询 C a b c  区间[a,b]的值都加上c Q a b     查询区间[a,b]值 ...

  2. 【线段树】【模板】讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值)

    [线段树][模板]讲解 + 例题1 HDU - 1754 I Hate It (点修改分数)+ 例题二 POJ - 3468 A Simple Problem with Integers(区间加值) ...

  3. POJ 3468 A Simple Problem with Integers

    分析:这题wa了好多次(看了下discuss好多人也是这样,好题~).一处是sum值会超int32,要用int64.还有一处是toadd要累加,我不知道是受上一题影响还是怎的..pushdown的时候 ...

  4. POJ 3468 A Simple Problem with Integers (1)

    POJ_3468(1) 在消化了PPT上思想之后,又重新做了一下这个题目. 不妨将原数组的元素记作a[i],然后我们用堆建立两棵线段树,一棵的原数组为x[i](x[i]=a[i]-a[i-1],即原数 ...

  5. POJ 2528 Mayor's posters 贴海报 线段树 区间更新

    注意离散化!!!线段树的叶子结点代表的是一段!!! 给出下面两个简单的例子应该能体现普通离散化的缺陷: 1-10 1-4 5-10 1-10 1-4 6-10 普通离散化算出来的结果都会是2,但是第二 ...

  6. POJ 3468 A Simple Problem with Integers(线段树:区间更新)

    http://poj.org/problem?id=3468 题意: 给出一串数,每次在一个区间内增加c,查询[a,b]时输出a.b之间的总和. 思路: 总结一下懒惰标记的用法吧. 比如要对一个区间范 ...

  7. POJ - 3468 A Simple Problem with Integers(分块)

    题目链接:点击查看 题目大意:给出一个长度为 n 的数列,再给出 m 次操作,每次操作分为两种情况: C l r d:区间 [ l , r ] 内的数字都加上 d Q l r :查询 [ l , r ...

  8. poj 3486 A Simple Problem with Integers(树状数组第三种模板改段求段)

    1 /* 2 树状数组第三种模板(改段求段)不解释! 不明白的点这里:here! 3 */ 4 #include<iostream> 5 #include<cstring> 6 ...

  9. POJ 2777 ZOJ 1610 HDU 1698 --线段树--区间更新

    直接将这3题 放一起了  今天在做线段树的东西 这3个都是区间更新的 查询方式互相不同 反正都可以放到一起吧 直接先上链接了 touch me touch me touch me 关于涉及到区间的修改 ...

最新文章

  1. python mainloop函数_python中的mainloop()函数
  2. Failed to initialize NSS library
  3. st link v2引脚连接_ST-Link资料02_ST-Link固件介绍,及固件命名规则
  4. 内存中数据模型和大数据持久性
  5. cname 别名记录 解析过程_西部数码操作解析:如何为服务器创建别名地址
  6. 《卷积神经网络》学习笔记
  7. osea/ Overview 概述
  8. 【bzoj4940】这是我自己的发明
  9. 通俗版 OSI七层模型,物理介质
  10. Ubuntu18.04 上 phpvirtualbox 折腾记
  11. 如何保证kafka消息的可靠性传递?
  12. Android USBCamera投屏 - 利用UVC协议将手机上的画面有线投屏到Android车机的屏幕上
  13. 计算机主机的组成部分,计算机主机的组成是有哪些
  14. 在excel中如何筛选重复数据_EXCEL里如何快速统计重复的次数?
  15. 江南鹤微信公众号文章采集器,开发完成了!以后再也不发愁采集微信公众号文章了!
  16. 【零基础学Python】爬虫篇 :第十一节--Python爬虫Urllib用法合集
  17. iOS、mac开源项目及库(转载)
  18. Dotween简单安装设置
  19. 一键非自锁开关电路设计
  20. 安装海龟绘图类库(turtle)

热门文章

  1. R语言的特征选择(Feature Selection)包:Boruta和caret
  2. 人脸验证(四)--CenterLoss
  3. 双目测距(四)--罗德里格斯变换
  4. 纯新手DSP编程--5.18--调试(续)
  5. css不继承上级样式_这个笔记《CSS基本概念》,让菜鸟轻松学会给网页穿外衣
  6. mysql5.6 主从 延迟_MySQL5.6升级5.7时,出现主从延迟问题排查过程
  7. 【汇编语言】【ARM扩展资料】数据表示
  8. Redo Log的逻辑与物理结构
  9. 一道基础 Java 面试题,但值得很多人反思!
  10. Oracle和sqlserver数据类型对应