Feynman5210 @ 2024-08-16 16:19:38
#define INF -1000000000
#include<iostream>
using namespace std;
const int maxn=505000;
int n,m,a[maxn],opt,x,y;
struct node{
int l,r,lsum,rsum,sum,all;
}smt[maxn<<2];
struct s{
int lsum,rsum,sum,all;
};
inline s smax(s a,s b){
return {max(a.lsum,a.all+b.lsum),max(b.rsum,b.all+a.rsum),max(max(a.sum,b.sum),a.rsum+b.lsum),a.all+b.all};
}
inline void fz(s c,node d){
c.lsum=d.lsum,c.rsum=d.rsum,c.sum=d.sum,c.all=d.all;
}
inline void fu(node c,s d){
c.lsum=d.lsum,c.rsum=d.rsum,c.sum=d.sum,c.all=d.all;
}
#define ll smt[now].l
#define rr smt[now].r
#define mid (ll+rr>>1)
#define s1 smt[now].lsum
#define s2 smt[now].rsum
#define s3 smt[now].sum
#define s4 smt[now].all
#define lson smt[now<<1]
#define rson smt[now<<1^1]
inline void pushup(int now){
s sa,sb;fz(sa,lson);fz(sb,rson);
s sc=smax(sa,sb);fu(smt[now],sc);
}
void build(int now){
if(ll==rr){
s1=s2=s3=s4=a[ll];return;
}
lson.l=ll,rson.r=rr,lson.r=mid,rson.l=mid+1;
build(now<<1);build(now<<1^1);pushup(now);
}
void change(int now,int k,int val){
if(ll==rr){
s1=s2=s3=s4=val;return;
}
if(k<=mid)change(now<<1,k,val);
else change(now<<1^1,k,val);
pushup(now);
}
s check(int now,int l,int r){
if(l==ll&&r==rr)return {s1,s2,s3,s4};
s c={INF,INF,INF,INF},d={INF,INF,INF,INF};
if(l<=mid)c=check(now<<1,l,min(mid,r));
if(r>mid)d=check(now<<1^1,max(mid+1,l),r);
if(c.sum>-9e8&&d.sum>-9e8)return smax(c,d);
if(l<=mid)return c;return d;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
smt[1].l=1;smt[1].r=n;build(1);
for(int i=1;i<=m;i++){
cin>>opt>>x>>y;
if(opt==1){if(x<=y)cout<<check(1,x,y).sum<<"\n";else cout<<check(1,y,x).sum<<"\n";}
else change(1,x,y);
}
return 0;
}
by watermouthhang @ 2024-08-16 16:56:33
可以先说明你的每个函数是什么作用吗?谢谢
by Feynman5210 @ 2024-08-16 18:57:17
pushup上传,其中smax是求左右子最大值,fz是将node转为s,fu是将s转为node。(s为存储最大值但不存储左右端点的临时数据结构。
build是建树,change是修改,check是查询,不多说了。
那些#define,是为了省代码做的一些简写。
by Feynman5210 @ 2024-08-17 20:48:20
顶顶(dd)
by Feynman5210 @ 2024-08-18 10:24:48
dd 蒟蒻悬关求调
by Feynman5210 @ 2024-08-20 15:45:55
fz和fu函数必须写指针,否则实际上不会修改。
已A,此帖结。