线段树 (区间查询最大 区间求和 区间加)带lazy
const int N=1e5+; struct Segment_tree
{
struct Node
{
int val,Max,lazy;
int Size,son[];
void init()
{
lazy=son[]=son[]=Size=val=Max=val=;
}
} T[N*];
int cnt,root; void init(int l,int r,int *a)
{
cnt=;
root=build(l,r,a);
} void update(int pos)
{
if(T[pos].Size==)return ;
T[pos].val=T[T[pos].son[]].val+T[T[pos].son[]].val;
if(T[T[pos].son[]].lazy)
{
T[pos].val+=T[T[pos].son[]].lazy*T[T[pos].son[]].Size;
}
if(T[T[pos].son[]].lazy)
{
T[pos].val+=T[T[pos].son[]].lazy*T[T[pos].son[]].Size;
}
T[pos].Max=max(T[T[pos].son[]].Max+T[T[pos].son[]].lazy,T[T[pos].son[]].Max+T[T[pos].son[]].lazy);
} void pushdown(int pos)
{
if(pos==)return ;
if(T[pos].lazy)
{
if(T[pos].son[])
{
int x=T[pos].son[];
if(T[x].Size==)
{
T[x].val+=T[pos].lazy;
T[x].Max+=T[pos].lazy;
}
else
{
T[x].lazy+=T[pos].lazy;
}
}
if(T[pos].son[])
{
int x=T[pos].son[];
if(T[x].Size==)
{
T[x].val+=T[pos].lazy;
T[x].Max+=T[pos].lazy;
}
else
{
T[x].lazy+=T[pos].lazy;
}
}
T[pos].lazy=;
}
} int build(int l,int r,int *a)
{
int pos=++cnt;
T[pos].init();
T[pos].Size=r-l+;
if(l==r)
{
T[pos].val=a[l];
T[pos].Max=a[l];
return pos;
}
int mid=(l+r)>>;
T[pos].son[]=build(l,mid,a);
T[pos].son[]=build(mid+,r,a);
update(pos);
return pos;
} void add(int L,int R,int l,int r,int v,int pos=)
{
if(L==l&&R==r)
{
if(l==r)
{
T[pos].val+=v;
T[pos].Max+=v;
}
else
{
T[pos].lazy+=v;
}
return ;
}
int mid=(L+R)>>;
if(r<=mid)
add(L,mid,l,r,v,T[pos].son[]);
else if(l>mid)
add(mid+,R,l,r,v,T[pos].son[]);
else
{
add(L,mid,l,mid,v,T[pos].son[]);
add(mid+,R,mid+,r,v,T[pos].son[]);
}
update(pos);
} int query_Max(int L,int R,int l,int r,int pos=)
{
pushdown(pos);
update(pos);
if(L==l&&R==r)
{
return T[pos].Max;
}
int mid=(L+R)>>;
if(r<=mid)
return query_Max(L,mid,l,r,T[pos].son[]);
else if(l>mid)
return query_Max(mid+,R,l,r,T[pos].son[]);
else
return max(query_Max(L,mid,l,mid,T[pos].son[]),query_Max(mid+,R,mid+,r,T[pos].son[]));
} int query_Sum(int L,int R,int l,int r,int pos=)
{
pushdown(pos);
update(pos);
if(L==l&&R==r)
{
return T[pos].val;
}
int mid=(L+R)>>;
if(r<=mid)
return query_Sum(L,mid,l,r,T[pos].son[]);
else if(l>mid)
return query_Sum(mid+,R,l,r,T[pos].son[]);
else
return query_Sum(L,mid,l,mid,T[pos].son[])+query_Sum(mid+,R,mid+,r,T[pos].son[]);
} }tree;
线段树 (区间查询最大 区间求和 区间加)带lazy的更多相关文章
- 线段树 区间开方区间求和 & 区间赋值、加、查询
本文同步发表于 https://www.zybuluo.com/Gary-Ying/note/1288518 线段树的小应用 -- 维护区间开方区间求和 题目传送门 约定: sum(i,j) 表示区间 ...
- HDU1166(线段树 +更新单点,求区间总和)、HDU1754(线段树 + 更新单点,求区间最大值)
线段树简单应用 先附上几张图便与理解,大佬文章传送门1.传送门2 HDU1166:题目描述 线段树 +更新单点,求区间总和 代码如下(递归版) #include<iostream> #in ...
- HDU 1754 I Hate It(线段树之单点更新,区间最值)
I Hate It Time Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- ACM_最值差(线段树区间查询最值)
最值差 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定N个数A1A2A3A4...AN.求任意区间Ai到Aj中的最大数与最小 ...
- HDU 1754 I Hate It(线段树区间查询,单点更新)
描述 很多学校流行一种比较的习惯.老师们很喜欢询问,从某某到某某当中,分数最高的是多少. 这让很多学生很反感.不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问.当然,老 ...
- POJ_3468 A Simple Problem with Integers 【线段树区间查询+修改】
一.题目 POJ3468 二.分析 裸的线段树区间查询+修改. 三.AC代码 #include <cstdio> #include <iostream> #include &l ...
- HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和
To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
- HZAU 1207 Candies(线段树区间查询 区间修改)
[题目链接]http://acm.hzau.edu.cn/problem.php?id=1207 [题意]给你一个字符串,然后两种操作:1,将区间L,R更新为A或者B,2,询问区间L,R最长的连续的B ...
- 【线段树(单点修改,区间求和)】HDU1166 - 敌军布阵
hdu1166 敌兵布阵,单点修改,区间求和. [ATTENTION]MAXN要开成节点数的4倍,开得不够会提示TLE. #include<iostream> #include<cs ...
- hdu 1698 线段树(成段替换 区间求和)
一条钩子由许多小钩子组成 更新一段小钩子 变成铜银金 价值分别变成1 2 3 输出最后的总价值 Sample Input11021 5 25 9 3 Sample OutputCase 1: The ...
随机推荐
- 微信小程序(一)
开发流程 注册微信小程序并申请微信支付-->制作小程序-->上传并提交审核-->审核通过,小程序上线 开发微信小程序需要准备 企业公众号(被认证)以及申请小程序.微信开发技术.S ...
- Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- 关于c++栈溢出的问题
我自己定义了一个数据类型node,嵌套在另一个数据类型当中时候,用到了delete函数, 在我node的声明当中声明了几个指针 在我的析构函数中却调用了delet函数 结果程序结果是能跑出来 提示我栈 ...
- MySQL的InnoDB引擎与MyISAM引擎
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...
- OpenCV 之 空间滤波
1 空间滤波 1.1 基本概念 空间域,在图像处理中,指的是像平面本身: 空间滤波,则是在像平面内,对像素值所进行的滤波处理. 如上图所示,假设点 (x, y) 为图像 f 中的任意点,中间正方形 ...
- Link/cut Tree
Link/cut Tree 一棵link/cut tree是一种用以表示一个森林,一个有根树集合的数据结构.它提供以下操作: 向森林中加入一棵只有一个点的树. 将一个点及其子树从其所在的树上断开. 将 ...
- 帮Python找“对象”
引言:你一定会感叹:Python还缺找对象? 毕竟"一切皆对象"是人家Python的哲学理念.不过,Python 允许程序员以纯粹的面向过程的方式来使用它,所以人们有时会忽视它那 ...
- R+OCR︱借助tesseract包实现图片文本提取功能
2016年11月,Jeroen Ooms在CRAN发布了tesseract包,实现了R语言对简单图片的文本提取.分析功能. 利用开源OCR引擎进行图片处理,目前可以识别超过100种语言,R语言可以借助 ...
- SSH2三大框架SQL查询
/** * 查询省份名称 * @author YHD * @return * @see */ @SuppressWarnings("unchecked") @Override pu ...
- linux 时间和日期的设置
Linux机器上的时间比较复杂,有各式各样的时钟和选项等等.机器里有两个时钟,硬件时钟从根本上讲是CMOS时钟,而系统时钟是由内核维护的. 1. 修改硬件时钟 (1)更新机器的硬件时间.命令为:hwc ...