代码求调(玄关)
查看原帖
代码求调(玄关)
1260617
kairuigg楼主2024/5/23 08:05

样例可过,但炸了。

#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,q;
const int maxn=5e4+5;
int a[maxn],sum[maxn<<2],sum_l[maxn<<2],sum_r[maxn<<2],sum_m[maxn<<2],ans,cnt;

void push_up(int k){
    sum[k]=sum[k<<1]+sum[k<<1|1];
    sum_l[k]=max(sum_l[k<<1],sum_r[k<<1]+sum[k<<1]);
    sum_r[k]=max(sum[k<<1|1]+sum_r[k<<1],sum_r[k<<1|1]);
    sum_m[k]=max(max(sum_m[k<<1],sum_m[k<<1|1]),sum_l[k<<1|1]+sum_r[k<<1]);
}

void buildtree(int k,int l,int r){
    if(l==r){
        sum[k]=sum_l[k]=sum_r[k]=sum_m[k]=a[l];
        return ; 
    }
    int m=(l+r)>>1;
    buildtree(k<<1,l,m);
    buildtree(k<<1|1,m+1,r);
    push_up(k);
}

void query(int k,int l,int r,int x,int val){
    if(l==r){
        sum[k]=val;
        sum_l[k]=val;
        sum_r[k]=val;
        sum_m[k]=val;
        return ;
    }
    int m=(l+r)>>1;
    if(x<=m){
        query(k<<1,l,m,x,val);
    }
    if(x>=m+1){
        query(k<<1|1,m+1,r,x,val);
    }
    push_up(k);
}

void query_sum(int k,int l,int r,int x,int y){
    if(x<=l&&y>=r){
        ans=max(ans,sum_m[k]);
        ans=max(ans,cnt+sum_l[k]);
        cnt=max(sum_r[k],cnt+sum[k]);
        return ;
    }
    int m=(l+r)>>1;
    int ans=0;
    if(x<=m){
        query_sum(k<<1,l,m,x,y);
    }
    if(y>=m+1){
        query_sum(k<<1|1,m+1,r,x,y);
    }
    return ;
}

signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    buildtree(1,1,n);
    cin>>q;
    while(q--){
        int opt,l,r;
        cin>>opt>>l>>r;
        if(opt==0){
            query(1,1,n,l,r);
        }
        else{
            ans=cnt=-1e18;
            query_sum(1,1,n,l,r);
            cout<<ans<<'\n';
        }
    }
    return 0;
}
2024/5/23 08:05
加载中...