50分,求助

P1253 扶苏的问题

``` #include<iostream> #include<cstdio> #include<cstring> #define ll long long using namespace std; struct node{ ll l,r,Max,laz_add,laz_cover_need,laz_cover_num; } tre[4000010]; ll n,m,z,x,y,c,ans,a[1000010]; void make(ll l,ll r,ll s){//建树 tre[s].l=l; tre[s].r=r; if(l==r){ tre[s].Max=a[l]; return; } ll mid=(l+r)>>1; make(l,mid,s<<1); make(mid+1,r,s<<1|1); tre[s].Max=max(tre[s<<1].Max,tre[s<<1|1].Max); return; } void push_d(ll s)//清除懒惰标记 { if(tre[s].laz_cover_need==1){ tre[s*2].laz_cover_need=1; tre[s*2].laz_cover_num=tre[s].laz_cover_num; tre[s*2].laz_add=0; tre[s*2].Max=tre[s].laz_cover_num; tre[s*2+1].laz_cover_need=1; tre[s*2+1].laz_cover_num=tre[s].laz_cover_num; tre[s*2+1].laz_add=0; tre[s*2+1].Max=tre[s].laz_cover_num; tre[s].laz_cover_need=0; tre[s].laz_cover_num=0; } if(tre[s].laz_add!=0){ tre[s*2].Max+=tre[s].laz_add; tre[s*2].laz_add+=tre[s].laz_add; tre[s*2+1].Max+=tre[s].laz_add; tre[s*2+1].laz_add+=tre[s].laz_add; tre[s].laz_add=0; } return; } void change_add(ll l,ll r,ll s,ll cc){//区间加减 if(tre[s].l>=l&&tre[s].r<=r){ tre[s].Max+=cc; tre[s].laz_add+=cc; return; } push_d(s); if(tre[s*2].r>=l) change_add(l,r,s*2,cc); if(tre[s*2+1].l<=r) change_add(l,r,s*2+1,cc); tre[s].Max=max(tre[s*2].Max,tre[s*2+1].Max); return; } void change_cover(ll l,ll r,ll s,ll cc){//区间修改 if(tre[s].l>=l&&tre[s].r<=r){ tre[s].laz_add=0; tre[s].Max=cc; tre[s].laz_cover_need=1; tre[s].laz_cover_num=cc; return; } push_d(s); if(tre[s*2].r>=l) change_cover(l,r,s*2,cc); if(tre[s*2+1].l<=r) change_cover(l,r,s*2+1,cc); tre[s].Max=max(tre[s*2].Max,tre[s*2+1].Max); return; } ll ask(ll l,ll r,ll s){//询问区间最大值 if(tre[s].l>=l&&tre[s].r<=r) return tre[s].Max; push_d(s); ll value=(ll)-1e15; if(tre[s*2].r>=l) value=max(value,ask(l,r,s*2)); if(tre[s*2+1].l<=r) value=max(value,ask(l,r,s*2+1)); return value; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>m; for(ll i=1;i<=n;i++) cin>>a[i]; make(1,n,1); for(ll i=1;i<=m;i++){ ll q,l,r,num; cin>>q; if(q==1){ cin>>l>>r>>num; change_cover(l,r,1,num); } else if(q==2){ cin>>l>>r>>num; change_add(l,r,1,num); } else{ cin>>l>>r; cout<<ask(l,r,1)<<"\n"; } } return 0; } ```
by zhsm_ @ 2022-08-06 16:19:40


超了一半 有十名特判也能过 https://www.luogu.com.cn/paste/lkj4rmbl
by ls2128606 @ 2022-08-06 16:58:22


什么意思
by leozty @ 2022-08-06 18:37:25


已经对了,谢谢各位大佬的帮助
by leozty @ 2022-08-07 07:49:24


|