zkw线段树 模板

本文提供了线段树的基本模板代码,包括单点修改、区间查询等功能,并附带详细注释帮助理解实现细节。

自己被网络流狂虐,所以就写数据结构去了。。。

下面这个模板还是罗雨屏神犇写的。。。我加了点注释。


#include<cstdio>
#include<cstring>
#include<iostream>

#define M (1<<20)

void modify(int x,int v){//单点修改
	x+=M;//M为大值,从叶子向上遍历 
	for(st[x]=v;x>1;x>>=1)//锁定叶子节点的值为v的向上遍历 
		st[x>>1]=min(st[x],st[x^1]);
}

int query(int L,int R){//区间查询(该模板是求区间最小值) 
	int t=1e9;
	//首先变为开区间 
	for(int L+=M-1,R+=M+1;L!=(R^1);L>>=1,r>>=1){//直到移到L和R为相邻的兄弟节点 
		if((L&1)==0)t=min(t,st[L+1]);//如果L为左儿子,那么它的右兄弟肯定在区间内 
		if((R&1)==1)t=min(t,st[R-1]);//如果R为右儿子,那么它的左兄弟肯定在区间内 
	}
	return t;
}

void update(int x){//更新 
	st[x]=min(st[x<<1],st[(x<<1)^1]);
}

void mod(int L,int R){//下放标记 
	for(L+=M-1,R+=M+1;L!=(R^1);L>>=1,R>>=1){
		//这个put_flag和普通的线段树的写法一样,就自己写吧。 
		if(~L&1)put_flag(L+1);//如果L为左儿子,下放它右兄弟的标记 
		if( R&1)put_flag(R-1);//如果R为右儿子,下放它左兄弟的标记 
		update(L>>1),update(R>>1);//更新他们父亲节点的值 
	}
	for(;L>1;L>>=1)//更新父亲节点的值,直到根节点 
		update(L>>1);
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值