首页 > 其他分享 >线段树模板区间加(含懒标记)

线段树模板区间加(含懒标记)

时间:2023-12-09 22:14:03浏览次数:37  
标签:ll int 线段 tr else 含懒 build sum 模板

const int N = 1e5 + 10;
int n, m;
int a[N];
struct Tree{
	int l,r;
	ll sum,add;
	
}tr[4*N];
void build(int u,int l,int r){
	// l=tr[u].l;r=tr[u].r;
	//注释掉的部分是典型的错误,对于build过程中我们是初始化编号对应区间节点,上面赋值逻辑反了
	tr[u]={l,r};
	if(l==r)tr[u].sum=a[l];
	else{
		int mid=l+r>>1;
		build(u<<1,l,mid),build(u<<1|1,mid+1,r);
		tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
		
	}
}
void pushdown(int u){
	auto &root=tr[u],&b=tr[u<<1],&c=tr[u<<1|1];
	if(root.add){
		b.add+=root.add;b.sum+=(ll)(b.r-b.l+1)*root.add;
		c.add+=root.add;c.sum+=(ll)(c.r-c.l+1)*root.add;
		root.add=0;
	}
	
}

void update(int u,int x,int y,ll d){
	int l=tr[u].l, r=tr[u].r,mid=l+r>>1;
	if(x<=l&&y>=r){
		tr[u].sum+=(ll)(r-l+1)*d;
		tr[u].add+=d;
	}
	else {
		pushdown(u);
		if(x<=mid)update(u<<1,x,y,d);
		if(y>mid)update(u<<1|1,x,y,d);
		tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
	}
}
ll query(int u,int x,int y){
	int l=tr[u].l,r=tr[u].r,mid=l+r>>1;
	if(x<=l&&y>=r)return tr[u].sum;
	else {
		pushdown(u);
		ll ans=0;
		if(x<=mid)ans+=query(u<<1,x,y);
		if(y>mid)ans+=query(u<<1|1,x,y);
		return ans;
	}
	
}
void solve(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	while(m--){
	int op;cin>>op;
		if(op==1){
			int l,r,d;
			cin>>l>>r>>d;
			update(1,l,r,d);
		}
		else {
			int l,r;
			cin>>l>>r;
			ll ans=query(1,l,r);
			cout<<ans<<endl;
		}
	}
}

标签:ll,int,线段,tr,else,含懒,build,sum,模板
From: https://www.cnblogs.com/mathiter/p/17891869.html

相关文章

  • Spring Boot学习随笔- 集成JSP模板(配置视图解析器)、整合Mybatis(@MapperScan注解的使用
    学习视频:【编程不良人】2021年SpringBoot最新最全教程第五章、JSP模板集成5.1引入JSP依赖<!--引入jsp解析依赖--><!--C标签库--><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></depen......
  • Go 模板:用代码生成代码
    用代码生成代码。不用Go写代码,就不知道Java程序员被“惯”得有多厉害。Java奉行“拿来主义”,什么东西都有现成的库。而Go就没有那么丰富的库了。本文用生成器模式作为例子,来演示如何用代码生成代码。生成器模式熟悉Java开发的同学都知道,lombok有一个著名的注解......
  • 线段树
    首先是建树我们先构建整棵树的框架 structnode{intl,r;stringdata;}g[N*4];//不一定非要构建结构体,看题目需求,如果不涉及左右范围的话就可以直接构造数组 //n表示的是树上每个结点的数值,比如说第一个结点为1,那莫第一个结点的左子树为2,右子树为3//l(是......
  • excel导出模板,导入数据 后端代码
    依赖如下<!--poi3.9:导出excel--> <dependency>  <groupId>org.apache.poi</groupId>  <artifactId>poi</artifactId>  <version>3.9</version> </dependency> <dependency>  <groupId>org.apac......
  • 私域运营:12个朋友圈经营模板
    做私域运营的各位,想必大家都会烦恼朋友圈要发什么才能保证最高效吧!首先,我们需要明确,朋友圈是什么?朋友圈是我们打造信任感的地方,也是我们的信息能够及时触达用户的重要渠道。很多人都有一个习惯,每当添加一个新好友微信后会去翻一下ta的朋友圈。因为除了添加后说的第一句话,我们要了解......
  • 使用freemarker,导出制作好的ftl模板,并写入数据
    使用freemarker,导出制作好的ftl模板,并写入数据一、背景1.1项目背景最近在开发一个项目,需要导出一些数据,然后写入到word文档中,然后再导出到本地,这个需求是比较常见的,但是我在网上找了很多资料,都没有找到一个比较好的解决方案,所以就自己写了一个,这里分享给大家,希望能帮助到大家......
  • 打印模板学习笔记
     运算1、打印模板多则运算(相当于C#if、switch)//方法1嵌套iif函数=IIF(Fields!盈亏标志.Value="1","盘平",IIF(Fields!盈亏标志.Value="2","盘赢","盘亏"))=Switch((Fields.Item("盘点盈亏标志(黑-盘平,红-盘盈,蓝-盘亏,粗体-停用)").Value)="1","......
  • Thymeleaf模板引擎入门
    一、什么是模板引擎我们看一下百度百科怎么介绍的:模板引擎是为了使程序实现界面与数据分离,业务代码与逻辑代码的分离,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的HTML文档。我的理解就是我们获取到接口的数据后,通过规定的模板进行填充,生成HTML等格式代码......
  • 5 分钟,带你入门 FreeMarker 模板引擎!
    大家好,我是鱼皮。最近不是打算带大家做一个代码生成项目嘛,项目的第一阶段就是先做一个本地的代码生成器。代码生成器的核心功能就是根据用户输入的选项参数来生成不同的代码文件。代码生成器的核心原理那么如何实现这个功能呢?最经典的方法就是:提前编写模板文件,并将用户输入的参......
  • 【数据结构】线段树 (二) 学习笔记
    线段树(二)点击查看:线段树(一)学习笔记本文介绍权值线段树与动态开点线段树,(可能后面还会加线段树合并等等)。权值线段树线段树的动态开点线段树合并推荐题目&&参考资料&&拓展阅读《算法竞赛进阶指南》0x43线段树P3870 [TJOI2009]开关P1438 无聊的数列P1253 扶苏的问......