自己被网络流狂虐,所以就写数据结构去了。。。
下面这个模板还是罗雨屏神犇写的。。。我加了点注释。
#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);
}
本文提供了线段树的基本模板代码,包括单点修改、区间查询等功能,并附带详细注释帮助理解实现细节。
519

被折叠的 条评论
为什么被折叠?



