带有lazy标记的线段树
#include<bits/stdc++.h>
using namespace std;
int n,m,x,y,val,com,s[];
struct st{
int l,r,val,add;
}tr[];
void build(int l,int r,int k)
{
tr[k].l=l;
tr[k].r=r;
if(l==r)
{
tr[k].val=s[l];
return;
}
int mid=(l+r)>>;
build(l,mid,k<<);
build(mid+,r,k<<|);
tr[k].val = tr[k<<].val + tr[k<<|].val;
}
void pus(int k)
{
int l=tr[k].l;
int r=tr[k].r;
tr[k].add+=tr[k>>].add;
tr[k].val+=(r-l+)*tr[k>>].add;
}
void update(int x,int y,int k,int val)
{
if(tr[k].add)
{
pus(k<<);
pus(k<<|);
tr[k].add=;
}
int l=tr[k].l;
int r=tr[k].r;
int mid=(l+r)>>;
if(y<l || x>r)
return;
if(x<=l && r<=y)
{
tr[k].val += (l-r+)*val;
tr[k].add += val;
return;
}
else
{
if(x<=mid)
update(x,y,k<<,val);
if(y>mid)
update(x,y,k<<|,val);
tr[k].val = tr[k<<].val + tr[k<<|].val;
}
}
int sum(int x,int y,int k)
{
if(tr[k].add)
{
pus(k<<);
pus(k<<|);
tr[k].add=;
}
int l=tr[k].l;
int r=tr[k].r;
int mid=(l+r)>>;
if(y<l || x>r)
return ;
if(x<=l && r<=y)
return tr[k].val;
else
{
int ans=;
if(x<=mid)
ans+=sum(x,y,k<<);
if(y>mid)
ans+=sum(x,y,k<<|);
return ans;
}
}
main(){
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
scanf("%d",&s[i]);
build(,n,);
while(m--)
{
scanf("%d",&com);
if(com==)
{
scanf("%d%d%d",&x,&y,&val);
update(x,y,,val);
}
else
{
scanf("%d%d",&x,&y);
printf("%d\n",sum(x,y,));
}
}
}
带有lazy标记的线段树的更多相关文章
- HDU1698 just a Hook - 带有lazy标记的线段树
2017-08-30 16:44:33 writer:pprp 上午刚刚复习了一下不带有lazy标记的线段树, 下午开始学带有lazy标记的线段树 这个是我看大佬代码敲的,但是出了很多问题, 这提醒我 ...
- HDU 1698 just a hook - 带有lazy标记的线段树(用结构体实现)
2017-08-30 18:54:40 writer:pprp 可以跟上一篇博客做个对比, 这种实现不是很好理解,上一篇比较好理解,但是感觉有的地方不够严密 代码如下: /* @theme:segme ...
- 洛谷 1083 (NOIp2012) 借教室——标记永久化线段树 / 差分+二分
题目:https://www.luogu.org/problemnew/show/P1083 听说线段树不标记永久化会T一个点. 注意mn记录的是本层以下.带上标记的min! #include< ...
- [HDU5306]Gorgeous Sequence(标记回收线段树)
题意:维护一个序列,支持区间与一个数取min,询问区间最大,询问区间和(序列长度<=1e6) 分析: http://www.shuizilong.com/house/archives/hdu-5 ...
- [hdoj4578][多延迟标记的线段树]
Transformation Time Limit: 15000/8000 MS (Java/Others) Memory Limit: 65535/65536 K (Java/Others)T ...
- 可持久化线段树——区间更新hdu4348
和线段树类似,每个结点也要打lazy标记 但是lazy标记和线段树不一样 具体区别在于可持久化后lazy-tag不用往下传递,而是固定在这个区间并不断累加,变成了这个区间固有的性质(有点像分块的标记了 ...
- NOIP2012 D2 T2 借教室 线段树 OR 二分法
题目描述: 在大学期间,经常需要租借教室.大到院系举办活动,小到学习小组自习讨论,都需要向学校申请借教室.教室的大小功能不同,借教室人的身份不同,借教室的手续也不一样. 面对海量租借教室的信息,我们自 ...
- poj 3468 A Simple Problem with Integers (线段树区间更新求和lazy思想)
A Simple Problem with Integers Time Limit: 5000MS Memory Limit: 131072K Total Submissions: 75541 ...
- Codeforces 444C 线段树 懒惰标记
前天晚上的CF比赛div2的E题,很明显一个线段树,当时还在犹豫复杂度的问题,因为他是区间修改和区间查询,肯定是要用到懒惰标记. 然后昨天真的是给这道题跪了,写了好久好久,...我本来是写了个add标 ...
随机推荐
- clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据。 这是一个bug 哈哈
clientdataset 读取excel 如果excel 文件不存在的时候 相应的gird 会不显示数据, 鼠标掠过 gird 格子 才会显示数据. 这是一个bug 哈哈
- Delphi 遍历类中的属性
http://blog.csdn.net/easyboot/article/details/8004954 Delphi 遍历类中的属性 标签: delphistringbuttonclassform ...
- 【minicap】基于图像识别的手机端UI自动化测试的截图方式更新
minicap属于STF框架的一个工具,可以高速截图.同步手机屏幕至浏览器等 为什么用minicap截图: 经过试验,截同一个屏幕的一张图,adb shell screencap速度为2.9秒,而 ...
- fastdfs集群安装过程_学习笔记
最终效果 初始化为6个节点 在/usr/local/software 目录下上传需要用到tar包,分别在各个节点上传 使用scp 将本地software目录复制到其他节点上 73.74为 tracke ...
- 事件驱动体系结构(EDA)
- C语言如何操作内存
1.用变量名来访问内存(c语言对内存地址的封装.数据类型.函数名)--直接访问内存(使用地址) 如 int a; 编译器将申请32bit的内存(4个内存单元),同时将内存地址和变量名a绑定,操作a时, ...
- accept()出的socket不会使用新的端口号
1 标识一个socket的是四元组,不只是端口号 client ip : client port : server ip : server port 2 accept出的新的socket仍然使用和li ...
- Git-第四篇廖雪峰Git教程学习笔记(3)远程仓库,克隆远端库
1.本次连接的是gitHub仓库. 1>创建SSH Key. ssh-keygen -t rsa -C "youremail@example.com" lfy@lfy-PC ...
- JDK11 | 第五篇 : 启动单个Java源代码文件的程序
文章首发于公众号<程序员果果> 地址 : https://mp.weixin.qq.com/s/h1L4FmzVSix434gVt8Fc7w 一.简介 JEP330-启动单文件代码程序(L ...
- [2019杭电多校第五场][hdu6630]permutation 2
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6630 题意为求出1-n,n个数的全排列中有多少种方案满足第一位为x,第n位为y,且相邻数字绝对值之差不 ...