悬棺求条,遇到负区间就输出0,其他正确

P4513 小白逛公园

zyh202 @ 2024-07-14 14:45:20

rt
die码如下

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,p;
struct node{
    int l,r,sum,ma,mal,mar;
}t[5000005];
void up(int c){
    if(t[c*2].mar<0&&t[c*2+1].mal<0) t[c].ma=max(t[c*2].mar,t[c*2+1].mal);
    else{
        t[c].ma=0;
        if(t[c*2].mar>0) t[c].ma+=t[c*2].mar;
        if(t[c*2+1].mal>0) t[c].ma+=t[c*2+1].mal;
    }
    t[c].ma=max(t[c].ma,max(t[c*2].ma,t[c*2+1].ma));
    t[c].mal=max(t[c*2].mal,t[c*2].sum+t[c*2+1].mal);
    t[c].mar=max(t[c*2+1].mar,t[c*2+1].sum+t[c*2].mar);
    t[c].sum=t[c*2].sum+t[c*2+1].sum;
}
void bd(int x,int y,int c){
    t[c].l=x,t[c].r=y;
    if(x==y){
        cin>>t[c].sum;
        t[c].ma=t[c].mal=t[c].mar=t[c].sum;
        return;
    }
    int mid=(x+y)/2;
    bd(x,mid,c*2);
    bd(mid+1,y,c*2+1);
    up(c);
}
void ad(int c,int x,int k){
    if(t[c].l==t[c].r){
        t[c].sum=t[c].ma=t[c].mal=t[c].mar=k;
        return;
    }
    int mid=(t[c].l+t[c].r)/2;
    if(x<=mid) ad(c*2,x,k);
    else ad(c*2+1,x,k);
    up(c);
}
node fd(int x,int y,int c){
    if(t[c].l>=x&&t[c].r<=y) return t[c];
    int mid=(t[c].l+t[c].r)/2;
    if(x<=mid&&y>mid){
        node ans,lc=fd(x,y,c*2),rc=fd(x,y,c*2+1);
        if(ans.mar<0&&rc.mal<0) ans.ma=max(lc.mar,rc.mal);
        else{
            ans.ma=0;
            if(lc.mar>0) ans.ma+=lc.mar;
            if(rc.mal>0) ans.ma+=rc.mal;
        }
        ans.ma=max(ans.ma,max(lc.ma,rc.ma));
        ans.mal=max(lc.mal,lc.sum+rc.mal);
        ans.mar=max(rc.mar,rc.sum+lc.mar);
        ans.sum=lc.sum+rc.sum;
        return ans; 
    }   
    else if(x<=mid) return fd(x,y,c*2);
    else return fd(x,y,c*2+1);
}
signed main(){
    cin>>n>>m;
    bd(1,n,1);
    while(m--){
        cin>>p;
        if(p==1){
            int x,y;
            cin>>x>>y;
            if(x>y) swap(x,y);
            cout<<fd(x,y,1).ma<<endl;
        }
        else{
            int x,k;
            cin>>x>>k;
            ad(1,x,k);
        }
    }
    return 0;
}

by candy0014 @ 2024-07-14 14:58:31

@zyh202 41 行 if 里一个 lc 打成 ans 了


by candy0014 @ 2024-07-14 14:58:58

偶是 47 行


by zyh202 @ 2024-07-14 15:31:29

thk,已关


by zyh202 @ 2024-07-14 15:34:33

@candy0014 ,已AC,万分感谢


by zyh202 @ 2024-07-14 15:34:58

此帖结


|