首页 > 其他分享 >线段树的各种板板~(*^▽^*)

线段树的各种板板~(*^▽^*)

时间:2024-02-20 09:22:08浏览次数:28  
标签:板板 lid 各种 int res 线段 tr rid id

$\color{purple}{板板}$
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f
#define INF 0x3f3f3f3f
#define mst(a,b) memset(a,b,sizeof(a))
#define Elaina 0
#define lid (id<<1)
#define rid (id<<1|1) //即rid 
const int N=1e5+100;
int a[N],n,m;
char s[10];
struct seg_tree{
	int l,r,maxx,minn,sum;
	int lazy;
}tr[N<<2];

void pushup(int id){
	tr[id].sum=tr[lid].sum+tr[rid].sum;
	tr[id].maxx=max(tr[lid].maxx,tr[rid].maxx);
	tr[id].minn=min(tr[lid].minn,tr[rid].minn);
}

//建树 
void build(int id,int l,int r){
	tr[id].l=l;
	tr[id].r=r;
	if(l==r){
		tr[id].sum=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(lid,l,mid);
	build(rid,mid+1,r);
	pushup(id);
}

//求总和更新值 
void changesum(int id,int x,int k)
{
	if(tr[id].l==tr[id].r)
	{
		tr[id].sum+=k;
		return;
	}
	if(x<=tr[lid].r)
		changesum(lid,x,k);
	else
		changesum(rid,x,k);
	tr[id].sum=tr[lid].sum+tr[rid].sum;
	return;
}

//求最大更新值
void changemax(int id,int x,int k)
{
	if(tr[id].l==tr[id].r)
	{
		tr[id].maxx=k;
		return;
	}
	int m=(tr[id].l+tr[id].r)>>1;
	if(x<=m)
		changemax(lid,x,k);
	else
		changemax(rid,x,k);
	tr[id].maxx=max(tr[lid].maxx,tr[rid].maxx);
	return;
}

//求最小更新值 
void changemin(int id,int x,int k)
{
	if(tr[id].l==tr[id].r)
	{
		tr[id].minn=k;
		return;
	}
	int m=(tr[id].l+tr[id].r)>>1;
	if(x<=m)
		changemin(lid,x,k);
	else
		changemin(rid,x,k);
	tr[id].minn=min(tr[lid].minn,tr[rid].minn);
	return;
} 

//查询区间和
int asksum(int id,int l,int r){
	if(l<=tr[id].l&&tr[id].r<=r){
		return tr[id].sum;
	}
	if(tr[id].r<l||tr[id].l>r){
		return 0;
	}
	int sum=0;
	if(tr[lid].r>=l) sum+=asksum(lid,l,r);
	if(tr[rid].l<=r) sum+=asksum(rid,l,r);
	return sum;
} 

//查询区间最大值 
int askmax(int id,int l,int r){
	if(tr[id].l>=l&&tr[id].r<=r){
		return tr[id].maxx;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	int res=-INF;
	if(l<=mid){
		res=max(res,askmax(lid,l,r));
	}
	if(r>mid){
		res=max(res,askmax(rid,l,r));
	}
	return res;
}

//查询区间最小值 
int askmin(int id,int l,int r){
	if(tr[id].l>=l&&tr[id].r<=r){
		return tr[id].minn;
	}
	int mid=(tr[id].l+tr[id].r)>>1;
	int res=INF;
	if(l<=mid){
		res=min(res,askmin(lid,l,r));
	}
	if(r>mid){
		res=min(res,askmin(rid,l,r));
	}
	return res;
}

//延迟标记(懒标记) 区间修改 区间(也可以单点)查询 
//void pushdown(int id){
//	if(tr[id].lazy){
//		int lz=tr[id].lazy;
//		tr[id].lazy=0;
//		tr[lid].lazy+=lz;
//		tr[rid].lazy+=lz;
//		tr[lid].sum+=lz*(tr[lid].r-tr[lid].l+1);
//		tr[rid].sum+=lz*(tr[rid].r-tr[rid].l+1);
//	}
//}
//void update(int id,int l,int r,int k){
//	if(tr[id].l>=l&&tr[id].r<=r){
//		tr[id].lazy+=k;
//		tr[id].sum+=k*(tr[id].r-tr[id].l+1);
//		return;
//	}
//	pushdown(id);
//	int mid=(tr[id].l+tr[id].r)>>1;
//	if(l<=mid) update(lid,l,r,k);
//	if(r>mid) update(rid,l,r,k);
//	pushup(id);
//}
//int query(int id,int l,int r){
//	if(tr[id].l>=l&&tr[id].r<=r){
//		return tr[id].sum;
//	}
//	pushdown(id);
//	int mid=(tr[id].l+tr[id].r)>>1;
//	int res=0;
//	if(l<=mid) res+=query(lid,l,r);
//	if(r>mid) res+=query(rid,l,r);
//	return res;
//}

signed main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	if(n==0)return Elaina;
	build(1,1,n);
	cin>>m;
	//输入应该不用我教给你叭(^_^) 
	for(int i=1;i<=m;i++){
		
	}
	return Elaina;
}

都看到这了,真的不点个赞吗(>ω<*)

标签:板板,lid,各种,int,res,线段,tr,rid,id
From: https://www.cnblogs.com/Elaina-0/p/18022387

相关文章

  • 线段树模板
    开局宏定义:#include<bits/stdc++.h>#defineintlonglong#definelson(now<<1)//现结点的左孩子#definerson(now<<1|1)//右孩子usingnamespacestd;结构体定义:structNode{intl,r;//表示左右区间intmax,sum;//其他数据域}tree[N<<2]//=N*......
  • Spring Boot 实现各种参数校验
    之前也写过一篇关于SpringValidation使用的文章,不过自我感觉还是浮于表面,本次打算彻底搞懂SpringValidation。本文会详细介绍SpringValidation各种场景下的最佳实践及其实现原理,死磕到底!项目源码:spring-validation:https://github.com/chentianming11/spring-validation简单使......
  • Map判空 、空字符串、空key值等各种判断方法
    一、Map本身的判空1.1“==null”不能判断Map的本身是否为null  1.2map.isEmpty()判断为空当map没有向里面put数据的时候,可以利用map自带得方法来进行判断该Map是否里面有值 1.3“==null”与“isEmpty()”最大的区别如果map是一个null存在,那么在利用isEmpty()来判空将......
  • 线段树(板子)
    线段树单点修改,单点,区间查询区间修改,单点,区间查询单点修改普通线段树code#definels(rt<<1)#definers(rt<<1|1)#definellllonglongconstintN=1000001;intn,m;inta[N];structT{ intl,r,data;}tr[N<<2];voidpushup(intrt){ tr[rt].da......
  • 利用COM组件实现对WORD书签各种操作大全
    有个需求是,程序导出一份word报告,报告中有各种各样的表格,导出时还需要插入图片。脑海中迅速闪过好几种组件,openxml组件,com组件,npoi。为了减少程序画复杂表格,我们选用了com组件+word模板的方式,程序只需要对word中的书签进行赋值即可。不知道这几种组件的(或者还有其他......
  • 线段树-基础模版
    线段树模版一埋头扎进线段树一上午感觉很神奇几个函数就能把它完整的复现下来这里有几张基础概念的图对着代码来想还是很好理解的最后是整理了能够处理总和最大值和最小值的线段树模版code:$\LARGE\color{purple}{代码在这里}$#include<bits/stdc++.h>usingnames......
  • 第十六节:各种排序算法总结和性能测试
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • 树状数组及线段树详解
    本文章是作者调了3个多小时后,感触颇深,历经1个多小时写出来的,不喜勿喷相关内容可参考模板总结中的树状数组及线段树;进入正题树状数组所谓树状数组,即像树的数组,一般应用于求多次前缀和以及区间前缀和的问题中;其根据节点编号的二进制数的末尾0的个数划分层次,每个节点的管辖......
  • 线段树进阶
    线段树进阶动态开点定义动态存储数据的线段树,可以优化空间复杂度实现为了避免\(N<<1\),不再使用完全二叉树存储,而记录左右儿子\(ls,rs\)此外需要\(tot\)记录已经开了多少点在递归时要记录点的左右区间,确保开点时能知道区间大小voidmodify(int&p,intL,intR,intl,i......
  • 线段树进阶
    线段树进阶线段树分治P5787判断二分图可以用扩展域并查集,采用线段树分治,线段树上的每一个结点作为每一段时间。每个结点上的修改和回溯需要用到可撤销的并查集。时间复杂度\(O(n\logk\logn)\)扫描线扫描线求矩形面积#include<bits/stdc++.h>usingnamespacestd;typ......