AndyC @ 2024-11-28 16:37:06
线段树能不能实现区间修改 区间查询最大值啊
这里区间修改的意思就是给区间中的每个数都和一个值val取个max
by Down_syndrome @ 2024-11-28 16:43:38
@yukimianyan?orz
by UYHW @ 2024-11-28 16:43:40
是否清醒
by __ZYX__ @ 2024-11-28 16:43:56
@Down_syndrome@In_Memory 为啥要吉司机
by AndyC @ 2024-11-28 16:44:53
@yukimianyan 细说
by AndyC @ 2024-11-28 16:47:28
兄弟们 我貌似搞出来了 大家看看对不对
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,a[500005],sum[500005],lazy[500005],x,y,num;
void push_down(int rt,int l,int r){
if(lazy[rt]>sum[rt]){
int m=r+l>>1;
sum[rt]=lazy[rt];
lazy[rt<<1]=max(lazy[rt],lazy[rt<<1]);
lazy[rt<<1|1]=max(lazy[rt],lazy[rt<<1|1]);
lazy[rt]=0;
}
}
void push_up(int rt){
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void build(int rt,int l,int r){
if(l==r){
sum[rt]=a[r];
return;
}
int m=r+l>>1;
build(rt<<1,l,m);
build(rt<<1|1,m+1,r);
push_up(rt);
}
void update(int rt,int l,int r,int ll,int rr,int v){
if(ll<=l&&rr>=r){
if(v<=sum[rt]) return;
lazy[rt]=max(lazy[rt],v);
sum[rt]=v;
return;
}
push_down(rt,l,r);
int m=r+l>>1;
if(ll<=m){
update(rt<<1,l,m,ll,rr,v);
}
if(rr>m){
update(rt<<1|1,m+1,r,ll,rr,v);
}
push_up(rt);
}
int query(int rt,int l,int r,int ll,int rr){
if(ll<=l&&rr>=r){
return sum[rt];
}
push_down(rt,l,r);
int m=r+l>>1;
int res=0;
if(ll<=m) res=max(res,query(rt<<1,l,m,ll,rr));
if(rr>m) res=max(res,query(rt<<1|1,m+1,r,ll,rr));
return res;
}
signed main(){
n=100;
update(1,1,n,1,5,3);
update(1,1,n,4,5,200);
cout<<query(1,1,n,1,5)<<endl;
}
/*
7 3
1 2 3 4 5 6 7
1 1 7 3
1 1 3 -2
2 1 3
9
8 10
659 463 793 740 374 330 772 681
1 5 8 39
2 5 8
1 3 6 3
1 5 8 90
1 1 5 21
2 3 8
1 3 8 17
1 4 7 52
2 2 6
1 2 7 41
2313
4281
3278
*/
by __ZYX__ @ 2024-11-28 16:47:54
@AndyC 就是你直接修改的时候就
w[u]=max(w[u],k);
lazy[u]=max(lazy[u],k);
然后 pushdown
就正常子节点取
by Down_syndrome @ 2024-11-28 16:49:52
@ZYX 哦对哦我唐唐唐