[板子]segTree
segTree
参考:http://www.cnblogs.com/TenosDoIt/p/3453089.html#c
初学者建议先参考上面“一步一步理解线段树”学习理论。
在这里Code分别为区间求和&区间求积的做法。
分别对应OJ luogu的3372和3373
1.区间和
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> using namespace std; struct node{ long long val,lazytag; }segTree[*+]; ]; int n,m,t,x,y,k; void build(int root,long long arr[],int istart,int iend){//建树 segTree[root].lazytag=; if(istart==iend){ segTree[root].val=arr[istart]; }else{ ; build(root*,arr,istart,mid); build(root*+,arr,mid+,iend); segTree[root].val=segTree[root*].val+segTree[root*+].val; } } void pushDown(int root,int start,int end){//插入懒标记 ){ segTree[root*].lazytag+=segTree[root].lazytag; segTree[root*+].lazytag+=segTree[root].lazytag; ; segTree[root*].val+=segTree[root].lazytag*(mid-start+); segTree[root*+].val+=segTree[root].lazytag*(end-mid); segTree[root].lazytag=; } } long long query(int root,int nstart,int nend,int qstart,int qend){//查询区间 if(qstart>nend||qend<nstart){ ; }if(qstart<=nstart&&qend>=nend){ return segTree[root].val; } pushDown(root,nstart,nend); ; ,nstart,mid,qstart,qend)+query(root*+,mid+,nend,qstart,qend); } void update(int root,int nstart,int nend,int ustart,int uend,int addval){//赋值 if(ustart>nend||uend<nstart){ return; }if(ustart<=nstart&&uend>=nend){ segTree[root].lazytag+=addval; segTree[root].val+=addval*(nend-nstart+); return; } pushDown(root,nstart,nend); ; update(root*,nstart,mid,ustart,uend,addval); update(root*+,mid+,nend,ustart,uend,addval); segTree[root].val=segTree[root*].val+segTree[root*+].val; } int main(){ scanf("%lld%lld",&n,&m); ;i<=n;i++){ scanf("%lld",&a[i]); } build(,a,,n); ;i<=m;i++){ scanf("%lld",&t); ){ scanf("%lld%lld%lld",&x,&y,&k); update(,,n,x,y,k); }){ scanf("%lld%lld",&x,&y); printf(,,n,x,y)); } } }
2.区间积
在这里要点几个点注意:
1:tag2的初始值为1;
2:pushdown里先tag2后tag1(先乘后加);
3:对tag2进行push需要先把tag1*tag2,tag2*tag2,val*tag2,最后别忘了tag2=1;
4:tag2不需要乘区间,原因是:a*(b+c)=a*b+a*c,乘法分配律;
#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> using namespace std; struct node{ long long val,lazytag,lazytag2; }segTree[*+]; ]; long long n,m,t,x,y,k,p; void build(int root,long long arr[],int istart,int iend){//建树 segTree[root].lazytag=; segTree[root].lazytag2=; if(istart==iend){ segTree[root].val=arr[istart]; }else{ ; build(root*,arr,istart,mid); build(root*+,arr,mid+,iend); segTree[root].val=segTree[root*].val+segTree[root*+].val; } } void pushDown(int root,int start,int end){//插入懒标记 **){** segTree[root*].lazytag=(segTree[root*].lazytag*segTree[root].lazytag2)%p; segTree[root*+].lazytag=(segTree[root*+].lazytag*segTree[root].lazytag2)%p; segTree[root*].lazytag2=(segTree[root*].lazytag2*segTree[root].lazytag2)%p; segTree[root*+].lazytag2=(segTree[root*+].lazytag2*segTree[root].lazytag2)%p; ; segTree[root*].val=(segTree[root*].val*(segTree[root].lazytag2))%p; segTree[root*+].val=(segTree[root*+].val*(segTree[root].lazytag2))%p; segTree[root].lazytag2=; } ){ segTree[root*].lazytag+=segTree[root].lazytag; segTree[root*+].lazytag+=segTree[root].lazytag; ; segTree[root*].val+=segTree[root].lazytag*(mid-start+); segTree[root*+].val+=segTree[root].lazytag*(end-mid); segTree[root].lazytag=; } } long long query(int root,int nstart,int nend,int qstart,int qend){//查询区间 if(qstart>nend||qend<nstart){ ; }if(qstart<=nstart&&qend>=nend){ return segTree[root].val; } pushDown(root,nstart,nend); ; ,nstart,mid,qstart,qend)+query(root*+,mid+,nend,qstart,qend); } void update(int root,int nstart,int nend,int ustart,int uend,int addval){//赋值 if(ustart>nend||uend<nstart){ return; }if(ustart<=nstart&&uend>=nend){ segTree[root].lazytag+=addval; segTree[root].val+=addval*(nend-nstart+); return; } pushDown(root,nstart,nend); ; update(root*,nstart,mid,ustart,uend,addval); update(root*+,mid+,nend,ustart,uend,addval); segTree[root].val=segTree[root*].val+segTree[root*+].val; } **void tupdate(int root,int nstart,int nend,int ustart,int uend,int addval){//赋值(chengfa** if(ustart>nend||uend<nstart){ return; }if(ustart<=nstart&&uend>=nend){ segTree[root].lazytag=(segTree[root].lazytag*addval)%p; segTree[root].lazytag2=(segTree[root].lazytag2*addval)%p; segTree[root].val=(segTree[root].val*addval)%p; return; } pushDown(root,nstart,nend); ; tupdate(root*,nstart,mid,ustart,uend,addval); tupdate(root*+,mid+,nend,ustart,uend,addval); segTree[root].val=segTree[root*].val+segTree[root*+].val; } int main(){ scanf("%lld%lld%lld",&n,&m,&p); ;i<=n;i++){ scanf("%lld",&a[i]); } build(,a,,n); ;i<=m;i++){ scanf("%lld",&t); ){ scanf("%lld%lld%lld",&x,&y,&k); update(,,n,x,y,k); }){ scanf("%lld%lld",&x,&y); printf(,,n,x,y)%p); }){ scanf("%lld%lld%lld",&x,&y,&k); tupdate(,,n,x,y,k); } } ; }
并且感谢will7101的帮助
[板子]segTree的更多相关文章
- [板子]最小费用最大流(Dijkstra增广)
最小费用最大流板子,没有压行.利用重标号让边权非负,用Dijkstra进行增广,在理论和实际上都比SPFA增广快得多.教程略去.转载请随意. #include <cstdio> #incl ...
- [板子]ISAP
ISAP求最大流,敲了一发板子,无压行,教程略去.转载请随意. #include <cstdio> #include <cstring> #include <algori ...
- [板子]倍增LCA
倍增LCA板子,没有压行,可读性应该还可以.转载请随意. #include <cstdio> #include <cstring> #include <algorithm ...
- UP Board 人若有大胆,板子就很惨:首次上电开机失败
前言 原创文章,转载引用务必注明链接. 注意:拍照自带抖动功能,画质大家凑合着看.冬日天气干燥,手触摸板子前建议流水洗手或者握持大体积导电体将静电放走. 本文使用Markdown写成,为获得更好的阅读 ...
- orpsocv2 从ROM(bootrom)启动分析--以atlys板子的启动为例子
1 复位后的启动地址 1) 复位后,启动地址在or1200_defines.v最后宏定义,atlys板子的目录:orpsocv2\boards\xilinx\atlys\rtl\verilog\inc ...
- Lattice FPGA 板子 调试笔记
最近在调试LATTICE FPGA 做的视频板子,颇不顺利,所以记录下来作为以后的参考: 1.FPGA的IO口不是所有的都是双向的,有些有特殊作用的是单向的. 在查阅 LatticeECP3-17E ...
- 【图像处理】【SEED-VPM】1.板子基本操作流程
>>>>>>>>>>>>>>>>>>>>>>>>> ...
- NFS 网络文件系统挂载在A8板子上
我承认自己是菜鸟,没什么网络知识就来搞挂载nfs网络文件系统,花费了5天的时间才把nfs网络文件系统成功挂载在A8板子上,实现了A8板子和虚拟机的文件共享.分享一下个人经验: 以下是基于nfs已经完成 ...
- [PCB设计] 2、畸形PCB板子的制作核心——AD14导入dwg格式文件的方法
本文参考园友:The Zone of up.Craftor http://www.cnblogs.com/craftor/archive/2012/06/28/2567259.html 硬件工程师在做 ...
随机推荐
- Unity 3D Time 类
Time class in UnityEngine Description The interface to get time information from Unity. Static Var ...
- 翻译连载 | 第 9 章:递归(上)-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇
原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS>作者 关于译者:这是一个流淌着沪江血液的纯粹工程:认真,是 HTM ...
- MMORPG战斗系统随笔(二)、浅谈场寻路Flow Field PathFinding算法
转载请标明出处http://www.cnblogs.com/zblade/ 今天给大家带来一篇游戏中寻路算法的博客.去年,我加入一款RTS的游戏项目,负责开发其中的战斗系统,战斗系统的相关知识,属于游 ...
- notepad的快捷操作-代码速写
(一)先安装zencode插件 (二)运用插件 第一步:键入:html:xt 再Ctrl+Alt+Enter键 得到 <!DOCTYPE html PUBLIC "-//W3C//DT ...
- uvalive 3029 City Game
https://vjudge.net/problem/UVALive-3029 题意: 给出一个只含有F和R字母的矩阵,求出全部为F的面积最大的矩阵并且输出它的面积乘以3. 思路: 求面积最大的子矩阵 ...
- R语言画曲线图
本文以1950年到2010年期间我国的火灾统计数据为例,数据如下所示: (0)加载数据 data<-read.csv("E:\\MyDocument\\p\\Data\\1950~20 ...
- 在CentOS6上编译安装实现LAMP(php-modules)+phpMyAdmin安装过程全记录
php与apache协作有三种模式:CGI.modules.FastCGI. 在CGI模式下,用户请求php文件时,apache会启动响应进程,调用php处理器处理请求,然后将结果返回给客户端.用户响 ...
- webpack2使用ch3-自动化生成.html和内部引入的js自动更改
1 安装webpack插件 $ cnpm install html-webpack-plugin --save-dev 安装成功后 2 由于之前 dist/目录下,编译后的.html和.js会混在一起 ...
- Win CE 6.0 获取手持机GPS定位1----基础知识 (C#)
一.GPS全球定位系统的组成 (1)GPS卫星(空间部分) 由沿接近环形的地球轨道运行的24颗卫星组成,位于距地表20200千米的高空,均匀分布在6个轨道面上(每个轨道面4颗),轨道倾角55度.此外, ...
- dom4j之小小工具
dom4j经常不用,方法忘了又记,故做出读取xml和把document写入xml的小小工具~~~ /** * 读取document和将document对象写入到xml的小工具 * 使用该类必须给出do ...