首页 > 其他分享 >线段树

线段树

时间:2024-08-13 21:52:19浏览次数:12  
标签:val int 线段 tr mid build

模板

记得开 4 倍空间!!!

Code

#include<bits/stdc++.h>
#define ll long long
#define pf printf
#define sf scanf
using namespace std;
const int N=1e5+7;
int tr[N*4];
int f[N*4];
int a[N];
int n,q;
int l,r,val;
void build(int u,int l,int r){
	if(l==r){
		tr[u]=a[l];
		return;
	}
	int mid=(l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	tr[u]=tr[u*2]+tr[u*2+1];
}
void pushdown(int u,int l,int r){
	if(l==r){
		tr[u]+=f[u];
		f[u]=0;
		return;
	}
	tr[u]+=f[u]*(r-l+1);
	f[u*2]+=f[u];
	f[u*2+1]+=f[u];
	f[u]=0;
}
void add(int u,int L,int R,int l,int r,int val){
	if(l>=L&&r<=R){
		f[u]+=val;
		return;
	}
	int mid=(l+r)/2;
	pushdown(u,l,r);
	if(mid>=L) add(u*2,L,R,l,mid,val);
	if(mid+1<=R) add(u*2+1,L,R,mid+1,r,val);
}
int ask(int u,int L,int R,int l,int r){
	if(l>=L&&r<=R){
		pushdown(u,l,r);
		return tr[u];
	}
	int mid=(l+r)/2;
	int sum=0;
	pushdown(u,l,r);
	if(mid>=L) sum+=ask(u*2,L,R,l,mid);
	if(mid+1<=R) sum+=ask(u*2+1,L,R,mid+1,r);
	return sum;
}
int main(){
	sf("%d",&n);
	for(int i=1;i<=n;i++) sf("%d",&a[i]);
	build(1,1,n);
	sf("%d",&q);
	while(q--){
		int op;
		sf("%d%d%d",&op,&l,&r);
		if(op==1){
			sf("%d",&val);
			add(1,l,r,1,n,val);
		}else{
			pf("%d\n",ask(1,l,r,1,n));
		}
	}
	//利用线段树进行一些操作 
}

线段树合并

参考博客

经验

法阵(线段树降 \(\log\))

标签:val,int,线段,tr,mid,build
From: https://www.cnblogs.com/liyixin0514/p/18357759

相关文章

  • 【笔记】吉如一线段树
    【笔记】吉如一线段树吉如一论文(CQBZ内网,在PDF的103页1区间最值操作1.1区间取min(max),区间和当前应该修改值为\(x\);维护区间最大值\(mx\),最大值个数\(t\),严格次大值\(se\)。如果走到一个区间上,如果:\(x\gemx\),说明取min操作没用,直接return;\(mx>x>se\),打标......
  • 李超线段树板子
    点击查看代码#include<bits/stdc++.h>usingnamespacestd;constintN=1e6+5;constintmod=1e9;constintp=39989;constdoubleeps=1e-9;intn,m;intans,ansid;inttcnt,rt;structlmy{ doublek,b;}a[N];structTree{ intls,rs,id;}tr[N];boolc......
  • 【笔记】传统势能线段树
    1引入传统线段树能够通过打标记实现区间修改的条件有两个:能够快速处理标记对区间询问结果的影响;能够快速实现标记的合并。有的区间修改不满足上面两个条件。但存在一些奇妙的性质,使得序列每个元素被修改的次数有一个上限。如果我们保证每暴力\(O(\logn)\)修改一次的时......
  • 线段树进阶 Part 1
    线段树是信息学竞赛最常见的数据结构。本篇笔记总结技巧和应用,不介绍基本线段树算法。1.常见技巧1.1信息设计用线段树解决问题,首先得考虑维护哪些信息。若不带修,任何满足结合律且封闭的信息(称为半群)都是可维护的。结合律一般都有,封闭性帮助我们设计信息。例如区间最大子段......
  • 「Day 7—离散化 & 树状数组 & 线段树」
    离散化定义离散化本质是一种哈希,是一种用来处理数据的方法。1.创建原数组的副本。2.将副本中的值从小到大排序。3.将排序好的副本去重。4.查找原数组的每一个元素在副本中的位置,位置即为排名,将其作为离散化后的值。B3694数列离散化代码#include<iostream>#include<algo......
  • 区间历史最值线段树记录
    Description维护一个线段树,使得可以实现区间加、区间chkmin、求区间最值、区间历史最值、区间最大值。Solution先不考虑区间chkmin和历史最值,可以直接对于每个线段树节点维护一个tag,每次addtag更新。加上区间历史最值后,先考虑对于单个线段树节点怎么更新。容易发现对于......
  • 线段树水题集合
    用的都是《算法竞赛》的码风哦洛谷P3870极简,开和关用10表示,然后区间修改,区间求和,裸题洛谷P2846这两道题一模一样#include<bits/stdc++.h>usingnamespacestd;constintN=100005;#definelllonglongllls(llp){returnp<<1;}llrs(llp){returnp<<1|1;}lln......
  • 洛谷 P4556 雨天的尾巴之线段树合并模板
    洛谷P4556题解传送锚点摸鱼环节[Vani有约会]雨天的尾巴/【模板】线段树合并题目背景深绘里一直很讨厌雨天。灼热的天气穿透了前半个夏天,后来一场大雨和随之而来的洪水,浇灭了一切。虽然深绘里家乡的小村落对洪水有着顽固的抵抗力,但也倒了几座老房子,几棵老树被连根拔起,以......
  • zkw线段树
    介绍非递归线段树实现方法,码量较短。zkw线段树的构造原理:普通线段树采用堆存储,zkw线段树本质上是满二叉树(若没有该区间则为空点)但根据实际情况,原区间不一定构成满二叉树,据查询方式限制,空间开到最接近的\(2^n\)(据性质树值域=底层节点数),即不存在的点有虚点填充。既然不......
  • 关于区间加区间查线段树的标记永久化
    单点加区间查的线段树,每个线段树区间的值代表所维护序列在这个区间的总和;区间加单点查的线段树,每个线段树区间的值代表对这个区间总体加了多少。区间加区间查的线段树可以通过综合两种思想实现标记的永久化。线段树将每一个修改或查询区间拆分为\(O(\logw)\)个线段树区间,只要......