例题POJ3468 ----模板题

题目链接

原理详解:

首先 大家应该都已经会了线段树的 单点更新和单点查询了  也就是已经了解了线段树的整体机制

如果不了解 先看这个   单点修改 单点查询

那么 线段树的区间操作呢  主要是使用了一个延迟标记

lazy标记(延迟标记、懒惰标记)

通过线段树的区间查询和单点修改,我们知道,我们建立一棵二叉树,每个节点代表一个区间,叶子节点代表一个数,而我们单点修改的时候,只要从根出发自上向下,在log级别的复杂度内就可以找到我们要修改的点,然后修改这个点后,从叶子开始,自下向上把和其有关(受到影响)的节点全部修改。

那么区间修改,就是利用线段树里面每一个节点代表一个区间的特点,我们不需要去修改区间里的每一个值,而是在我们想要修改的区间对应的节点打上一个修改标记,也就是lazy标记,而在询问区间和的时候,检查所询问的区间的lazy标记,然后乘上原来的区间和,就得到了答案。

AC代码

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
ll sum[maxn<<2],add[maxn<<2];
struct Node{int l,r;int mid(){return (l+r)>>1;}
}tree[maxn<<2];
void PushUp(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void PushDown(int rt,int m){if(add[rt]){add[rt<<1]+=add[rt];add[rt<<1|1]+=add[rt];sum[rt<<1]+=add[rt]*(m-(m>>1));sum[rt<<1|1]+=add[rt]*(m>>1);add[rt]=0;}
}
void BuildTree(int l,int r,int rt){tree[rt].l=l;tree[rt].r=r;add[rt]=0;if(l==r){scanf("%I64d",&sum[rt]);return ;}int m=tree[rt].mid();BuildTree(l,m,rt<<1);BuildTree(m+1,r,rt<<1|1);PushUp(rt);
}
void Update(int c,int l,int r,int rt){if(tree[rt].l==l&&tree[rt].r==r){add[rt]+=c;sum[rt]+=(ll)c*(r-l+1);return ;}if(tree[rt].l==tree[rt].r) return ;PushDown(rt,tree[rt].r-tree[rt].l+1);int m=tree[rt].mid();if(r<=m) Update(c,l,r,rt<<1);else if(l>m) Update(c,l,r,rt<<1|1);else{Update(c,l,m,rt<<1);Update(c,m+1,r,rt<<1|1);}PushUp(rt);
}
ll Query(int l,int r,int rt){if(tree[rt].l==l&&tree[rt].r==r) return sum[rt];PushDown(rt,tree[rt].r-tree[rt].l+1);int m=tree[rt].mid();ll res=0;if(r<=m) res+=Query(l,r,rt<<1);else if(l>m) res+=Query(l,r,rt<<1|1);else{res+=Query(l,m,rt<<1);res+=Query(m+1,r,rt<<1|1);}return res;
}
int n,m,x,y,z;
char ch[3];
int main(){while(~scanf("%d%d",&n,&m)){BuildTree(1,n,1);while(m--){scanf("%s",ch);if(ch[0]=='Q'){scanf("%d%d",&x,&y);printf("%lld\n",Query(x,y,1));}else{scanf("%d%d%d",&x,&y,&z);Update(z,x,y,1);}}}return 0;
}

线段树详解 二 ----(区间修改区间查询)相关推荐

  1. 二维树状数组模板(区间修改+区间查询)

    二维树状数组模板(区间修改+区间查询) 例题:JOIOI上帝造题的七分钟 一共两种操作: \(L\ x_1\ y_1\ x_2\ y_2\ d\):把\((x_1,y_1)\),\((x_2,y_2) ...

  2. 线段树详解 (原理,实现与应用)

    线段树详解 By 岩之痕 目录: 一:综述 二:原理 三:递归实现 四:非递归原理 五:非递归实现 六:线段树解题模型 七:扫描线 八:可持久化 (主席树) 九:练习题 一:综述 假设有编号从1到n的 ...

  3. 【学习笔记】线段树详解(全)

    [学习笔记]线段树详解(全) 和三个同学一起搞了接近两个月的线段树,头都要炸了T_T,趁心态尚未凉之前赶快把东西记下来... [目录] [基础]作者:\((Silent\)_\(EAG)\) [懒标记 ...

  4. 如何在vs中创建r树索引代码_线段树详解与实现

    此篇文章用于记录<玩转数据结构>课程的学习笔记 什么是线段树 线段树也被称为区间树,英文名为Segment Tree或者Interval tree,是一种高级的数据结构.这种数据结构更多出 ...

  5. c语言线段树建树程序,c语言数据结构之线段树详解;例题:校门外的树(poj2808或者vijos1448)...

    线段树:它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个结点. 也就是说线段树的每一个结点对应一个区间,其中根节点对应区间[1,n] 对于线段树中的每一个非叶子节点[a,b],它的左儿子 ...

  6. 线段树详解(转)这个博客很棒~

    作者:Dong | 可以转载, 但必须以超链接形式标明文章原始出处和作者信息及版权声明 网址:http://dongxicheng.org/structure/segment-tree/ 1.概述 线 ...

  7. HDU 3974 Assign the task(DFS序+线段树单点查询,区间修改)

    描述 There is a company that has N employees(numbered from 1 to N),every employee in the company has a ...

  8. 【Python】全局变量详解二(修改全局变量值、定义位置和代码结构、命名建议)

    全局变量是在函数外部定义的变量(没有定义在某一个函数内),所有函数内部都可以使用这个变量. 提示:全局变量是可变的,在其他开发语言中,大多是不推荐使用全局变量的,因为可变范围太大,会导致程序后期不好维 ...

  9. 奇小葩讲设备树(2/5)-- Linux设备树详解(二)文件构成

    设备树就是描述单板资源以及设备的一种文本文件.至于出现的原因,基本的语法和使用方法,上一章节做了基本的介绍.本篇文章主要是更深层次的探讨设备文件的构成. 1. devie tree的编译 Device ...

  10. 数据结构_线段树 详解+模板

最新文章

  1. 网站发布外链如何防止后期被删除?
  2. HDU 2147 kiki's game
  3. Windows上的Java线程CPU分析
  4. Java中装箱与拆箱
  5. Oracle 日常巡检——数据库基本情况检查
  6. git 提交_GIT提交规范的使用和总结
  7. 异常检测1——python使用KNN模型进行异常检测
  8. 计算机系统安装要点,电脑重新装系统要注意哪些要点 重装系统时的六大事项...
  9. 图解Team Foundation Server 2013系列
  10. vscode c语言插件_推荐学习C语言或CPP使用的代码编辑器
  11. 网页设计html5留言板代码,网页制作:( 留言板 ), 我想改变留言字体的颜色( 单项选择:红/黄/蓝 )代码改如何编啊?, 十分感谢!...
  12. 计算机丢失xinput1 4 dll,VS中编译出现——计算机中丢失XINPUT1_4.dll解决办法
  13. 「我的microNome组学分析流程」第1版
  14. RGB颜色规律小研究
  15. 51单片机中哪些SFR可以位寻址?
  16. java 农历_java怎么取得农历的节日
  17. groupByKey与reduceByKey区别
  18. JS获取图片的EXIF信息+纠正图片方向
  19. Win10如何删除英语(美国)美式键盘
  20. 计算机类本科专业国家质量标准,计算机专业国家职业标准

热门文章

  1. DS实验题 最大最小
  2. 第24周SDAI缓解能否预测远期RA骨破坏受抑制
  3. [Ubuntu 10.04]Firefox中Flash汉字乱码问题的解决
  4. Visio2013里面的大括号
  5. css3简记,了解一下?
  6. Oracle中将小数转换成字符丢零.截取小数.除数为零解决法
  7. ARP 地址分类 NAT技术
  8. 大数据技术将是传统企业创新的原点
  9. 由DispatcherServlet看spring mvc请求处理过程
  10. pandas 之 set_index