线段树模板
线段树模板
——更改值
typedef long long ll; const int maxn=1e6+10; //定义最大值 struct node{ ll l,r,sum,tag; } tree[maxn*4];//四倍空间保证不越界 ll a[maxn]; void pushdown(ll x){//将所需更改的保存在根位置的值向下推进以完成赋值 if(tree[x].tag!=-1){ tree[x<<1].sum=max(tree[x].tag,tree[x<<1].sum); tree[x<<1|1].sum=max(tree[x].tag,tree[x<<1|1].sum); tree[x<<1].tag=max(tree[x<<1].tag,tree[x].tag); tree[x<<1|1].tag=max(tree[x<<1|1].tag,tree[x].tag); tree[x].tag=-1; } } void change(ll p,ll l,ll r,ll x){//更改特定点的值 if(tree[p].l==tree[p].r){ tree[p].sum=x; return; } pushdown(p); ll mid=(tree[p].l+tree[p].r)>>1; if(mid>=l) change(p<<1,l,r,x); if(mid<r) change(p<<1|1,l,r,x); return; } void change_all(ll p,ll l,ll r,ll x){//给在根位置记录所需更改的最大值 tree[1].tag=max(tree[1].tag,x); tree[1].sum=max(tree[1].sum,tree[1].tag); return; } void build(ll p,ll l,ll r){//构建线段树 tree[p].l=l; tree[p].r=r; tree[p].sum=tree[p].tag=-1; if(l==r){ tree[p].sum=a[l]; return; } ll mid=(l+r)>>1; build(p<<1,l,mid); build(p<<1|1,mid+1,r); } ll query(ll p,ll l,ll r){//查询从p(一般为1)层开始的[l,r]内的值 if(tree[p].l==tree[p].r){ return tree[p].sum; } pushdown(p); ll mid=(tree[p].l+tree[p].r)>>1; if(l<=mid) return query(p<<1,l,r); if(r>mid) return query(p<<1|1,l,r); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】