求助,区间求最大连续子段和的求和出了问题!
  • 板块学术版
  • 楼主yangjunhan1
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/9/12 22:46
  • 上次更新2023/11/2 21:07:55
查看原帖
求助,区间求最大连续子段和的求和出了问题!
856459
yangjunhan1楼主2023/9/12 22:46
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+10;
int lx[N<<2],rx[N<<2],rl[N<<2],s[N<<2],v[N],n,m;
void pushup(int rt){
    lx[rt]=max({lx[rt],lx[rt<<1],s[rt<<1]+lx[rt<<1|1]});
    rx[rt]=max({rx[rt],rx[rt<<1|1],s[rt<<1|1]+rx[rt<<1]});
    rl[rt]=max({lx[rt],rx[rt],rl[rt<<1],rl[rt<<1|1],rl[rt]});
    s[rt]=s[rt<<1]+s[rt<<1|1];
}
void build(int rt,int l,int r){
    if(l==r){
        lx[rt]=rx[rt]=rl[rt]=s[rt]=v[l];
        return ;
    }
    int mid=(l+r)>>1;
    build(rt<<1,l,mid);
    build(rt<<1|1,mid+1,r);
    pushup(rt);
}
void xg(int rt,int l,int r,int fx,int fv){
    if(l==r && l==fx){
        lx[rt]=rx[rt]=rl[rt]=s[rt]=fv;
        return ;
    }
    int mid=(l+r)>>1;
    if(fx<=mid)  xg(rt<<1,l,mid,fx,fv);
    else   xg(rt<<1|1,mid+1,r,fx,fv);
    pushup(rt);
}
int xw(int rt,int l,int r,int fl,int fr){
    if(fl<=l && r<=fr)  return max({lx[rt],rl[rt],rx[rt]});
    int mid=(l+r)>>1,ans=0;
    if(fl<=mid)  ans=max(ans,xw(rt<<1,l,mid,fl,fr));
    if(mid<fr)   ans=max(ans,xw(rt<<1|1,mid+1,r,fl,fr));
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)   cin>>v[i];
    build(1,1,n);
    while(m--){
        int op,l,r;
        cin>>op>>l>>r;
        if(op==1)   cout<<xw(1,1,n,l,r)<<endl;
        else    xg(1,1,n,l,r);
    }
    return 0;
}
2023/9/12 22:46
加载中...