zhangqz @ 2023-08-03 23:26:43
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
struct node{int ans=0,sl=0,sr=0,sum=0;};
int a[N],ans[N*4],sl[N*4],sr[N*4],sum[N*4],n,m;
int ls(int x){return x<<1;}
int rs(int x){return x<<1|1;}
int ps(int x){
sum[x]=sum[ls(x)]+sum[rs(x)];
ans[x]=max(ans[ls(x)],ans[rs(x)]);
ans[x]=max(ans[x],sr[ls(x)]+sl[rs(x)]);
sl[x]=max(sum[ls(x)]+sl[rs(x)],sl[ls(x)]);
sr[x]=max(sum[rs(x)]+sr[ls(x)],sr[rs(x)]);
}
void build(int l,int r,int x){
if(l==r){
ans[x]=a[l],sl[x]=a[l],sr[x]=a[l];
sum[x]=a[l];
return ;
}
int mid=(l+r)>>1;
build(l,mid,ls(x));
build(mid+1,r,rs(x));
ps(x);
}
void f(int l,int r,int x,int w,int k){
if(l==r){
a[l]=k;
ans[x]=sl[x]=sr[x]=a[l];
sum[x]=a[l];
return ;
}
int mid=(l+r)>>1;
if(w<=mid) f(l,mid,ls(x),w,k);
else f(mid+1,r,rs(x),w,k);
ps(x);
}
node hb(node x,node y){
node c;
c.sum=x.sum+y.sum;
c.ans=max(x.ans,y.ans);
c.ans=max(c.ans,x.sr+y.sl);
c.sl=max(x.sl,y.sl+x.sum);
c.sr=max(y.sr,y.sum+x.sr);
return c;
}
node qs(int l,int r,int x,int ll,int rr){
node c1,c2;
bool f1=false,f2=false;
if(ll<=l&&r<=rr){
c1.ans=ans[x];
c1.sl=sl[x];
c1.sr=sr[x];
c1.sum=sum[x];
return c1;
}
int mid=(l+r)>>1;
if(mid>=ll) c1=qs(l,mid,ls(x),ll,rr),f1=true;
if(mid+1<=rr) c2=qs(mid+1,r,rs(x),ll,rr),f2=true;
if(f1&&f2) return hb(c1,c2);
if(f1) return c1;
if(f2) return c2;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
build(1,n,1);
int k;
while(m--){
int l,r;node c;
scanf("%d%d%d",&k,&l,&r);
if(k==1){
if(l>r) swap(l,r);
c=qs(1,n,1,l,r);
cout<<c.ans<<endl;
}
else f(1,n,1,l,r);
}
return 0;
}
MLE 改为
int a[N],ans[N*4],sl[N*4],sr[N*4],sum[N*400],n,m;
AC
by JIAOBO226016 @ 2023-08-03 23:30:27
666
by zhangqz @ 2023-08-03 23:31:49
5e5*400=2e8
128MB约为3e7个int
反而没爆空间???
by _Adolf_Hitler_ @ 2023-08-04 07:12:44
@zhangqz 那我爆了。。。。。。
by sto_5k_orz @ 2023-08-04 14:54:38
@zhangqz 有没有一种可能,数组开小也会 MLE
by zhangqz @ 2023-08-06 08:38:40
那,我只增大其中一个为什么就过了?
而且我开得过大了吧?
by yinbe @ 2024-02-12 18:07:53
@zhangqz 洛谷算空间只会算用到的空间,所以sum开N*400不会炸,因为很多都用不到