Drind @ 2023-07-13 11:26:14
RT,只过了第一个点,其他的全部RE了
#include<bits/stdc++.h>
using namespace std;
struct segmenttree{
long long sum,mx,mxl,mxr;
int l,r;
}tree[5000001];
int a[5000001];
void pushup(int x){
tree[x].mx=max(tree[x*2].mxr+tree[x*2+1].mxl,max(tree[x*2].mx,tree[x*2+1].mx));
tree[x].mxl=max(tree[x*2].mxl,tree[x*2].sum+tree[x*2+1].mxl);
tree[x].mxr=max(tree[x*2+1].mxr,tree[x*2+1].sum+tree[x*2].mxr);
tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
}
void build(int x,int l,int r){
tree[x].l=l;
tree[x].r=r;
if(l==r){
tree[x].sum=tree[x].mxl=tree[x].mxr=tree[x].mx=a[l];
return;
}
int mid=(l+r)/2;
build(x*2,l,mid);
build(x*2+1,mid+1,r);
pushup(x);
}
void modify(int x,int pos,int v){
if(tree[x].l==tree[x].r&&tree[x].l==pos){
tree[x].sum=tree[x].mxl=tree[x].mxr=tree[x].mx=v;
return;
}
int mid=(tree[x].l+tree[x].r)/2;
if(mid>=pos) modify(x*2,pos,v);
if(pos>mid) modify(x*2+1,pos,v);
pushup(x);
}
segmenttree query(int x,int l,int r){
if(tree[x].l>=l&&tree[x].r<=r){
return tree[x];
}
int mid=(tree[x].l+tree[x].r)/2;
segmenttree ans;
if(mid>=r) return query(x*2,l,r);
else if(l>mid) return query(x*2+1,l,r);
else{
segmenttree a=query(x*2,l,r),b=query(x*2+1,l,r);
ans.mxl=max(a.mxl,a.sum+b.mxl);
ans.mxr=max(b.mxr,b.sum+a.mxr);
ans.mx=max(max(a.mx,b.mx),a.mxr+b.mxl);
}
return ans;
}
int main(){
long long n,m;
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
build(1,1,n);
for(int i=1;i<=m;i++){
int opt;
cin>>opt;
if(opt==1){
int l,r;
cin>>l>>r;
cout<<query(1,l,r).mx<<endl;
}
if(opt==2){
int pos,val;
cin>>pos>>val;
modify(1,pos,val);
}
}
}
by fluoxetine_ @ 2023-07-13 11:33:22
测试数据可能会出现 a > b 的情况,需要进行交换。。
姐姐注意读题昂