MnZn求调线段树板子

P1253 扶苏的问题

```cpp #include<bits/stdc++.h> #define int long long #define lc (i<<1) #define rc (i<<1|1) #define mid (l+r>>1) using namespace std; struct node{ int maxs,rev,add; }sgt[8000005]; int n,q,a[1000005]; void upd(node &x,node y,node z) { x.maxs=max(y.maxs,z.maxs); } void build(int i,int l,int r) { sgt[i].maxs=LLONG_MIN; sgt[i].rev=LLONG_MIN; if(l>=r) { sgt[i].maxs=a[r]; return; } build(lc,l,mid); build(rc,mid+1,r); upd(sgt[i],sgt[lc],sgt[rc]); } void pushdown_rev(int i) { int x=sgt[i].rev,y=sgt[i].add; sgt[i].rev=LLONG_MIN; sgt[i].add=0; sgt[lc].rev=x; sgt[lc].add+=y; sgt[lc].maxs=x+y; sgt[rc].rev=x; sgt[rc].add+=y; sgt[rc].maxs=x+y; } void pushdown_add(int i) { int x=sgt[i].add; sgt[i].add=0; sgt[lc].add+=x; sgt[lc].maxs=max(sgt[lc].maxs,sgt[lc].maxs+x); sgt[rc].add+=x; sgt[rc].maxs=max(sgt[rc].maxs,sgt[rc].maxs+x); } void pushdown(int i) { if(sgt[i].rev!=LLONG_MIN) pushdown_rev(i); else if(sgt[i].add) pushdown_add(i); } void mdf(int i,int l,int r,int x,int y,int d,int op) { if(x<=l&&r<=y) { if(op==1) { sgt[i].rev=d; sgt[i].maxs=d; } else { sgt[i].add+=d; sgt[i].maxs=max(sgt[i].maxs,sgt[i].maxs+d); } return; } pushdown(i); if(x<=mid) mdf(lc,l,mid,x,y,d,op); if(y>mid) mdf(rc,mid+1,r,x,y,d,op); upd(sgt[i],sgt[lc],sgt[rc]); } int qry(int i,int l,int r,int x,int y) { //cerr<<"DEBUG: "<<l<<' '<<r<<' '<<x<<' '<<y<<' '<<sgt[i].maxs<<endl; if(x<=l&&r<=y) return sgt[i].maxs; int res=LLONG_MIN; pushdown(i); if(x<=mid) res=max(res,qry(lc,l,mid,x,y)); if(y>mid) res=max(res,qry(rc,mid+1,r,x,y)); return res; } void debug(int i=1,int l=1,int r=n) { cerr<<l<<'~'<<r<<": "<<sgt[i].maxs<<' '<<sgt[i].rev<<' '<<sgt[i].add<<endl; if(l>=r) return; debug(lc,l,mid); debug(rc,mid+1,r); } signed main() { scanf("%lld%lld",&n,&q); for(int i=1;i<=n;i++) { scanf("%lld",&a[i]); } build(1,1,n); while(q--) { int op,x,y,z; scanf("%lld%lld%lld",&op,&x,&y); if(op>2) printf("%lld\n",qry(1,1,n,x,y)); else { scanf("%lld",&z); mdf(1,1,n,x,y,z,op); } } //debug(); return 0; } ```
by Shiota_Kaede @ 2022-09-11 20:37:11


@[_JYqwq_](/user/400269) pushdown_rev挂了
by Azure__ @ 2022-09-11 20:42:48


@[_JYqwq_](/user/400269) 不开 ll 见祖宗。
by JackMerryYoung @ 2022-09-11 20:43:28


@[Azure__](/user/565945) 可以具体说一下哪儿挂了吗/kk
by Shiota_Kaede @ 2022-09-11 20:43:47


@[JackMerryYoung](/user/224558) 看看第二行是什么
by Shiota_Kaede @ 2022-09-11 20:44:03


@[_JYqwq_](/user/400269) 欧WSSB, 还有您写的好奇怪啊。
by JackMerryYoung @ 2022-09-11 20:44:52


lz写的真怪,我刚刚搞错了
by Azure__ @ 2022-09-11 20:46:18


```cpp sgt[rc].add=sgt[lc].add=0; sgt[rc].maxs=sgt[lc].maxs=x;
by Azure__ @ 2022-09-11 20:48:35


@[_JYqwq_](/user/400269)
by Azure__ @ 2022-09-11 20:48:49


@[Azure__](/user/565945) 改了后还是50pts..
by Shiota_Kaede @ 2022-09-11 20:52:01


| 下一页