8pts(WA)求调
查看原帖
8pts(WA)求调
973480
CSP_SAKME楼主2025/6/22 20:48
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct Node{
    int left,right;
    int sum,val;
    int lv,rv;
    int lazy;
}t[maxn*4];
int n,q,a[maxn];

void pushup(int u){
    int ls=u*2,rs=u*2+1;
    t[u].sum=t[ls].sum+t[rs].sum;
    t[u].val=max(t[ls].rv+t[rs].lv,max(t[ls].val,t[rs].val));
    t[u].lv=max(t[ls].lv,t[rs].lv+t[ls].sum);
    t[u].rv=max(t[rs].rv,t[ls].rv+t[rs].sum);
}

void pushdown(int u){
    if(t[u].lazy){
        int ls=u*2,rs=u*2+1;
        t[ls].sum+=(t[ls].right-t[ls].left+1)*t[u].lazy;
        t[rs].sum+=(t[rs].right-t[rs].left+1)*t[u].lazy;
        t[ls].val+=t[u].lazy;
        t[rs].val+=t[u].lazy;
        t[ls].lv+=t[u].lazy;
        t[rs].lv+=t[u].lazy;
        t[ls].rv+=t[u].lazy;
        t[rs].rv+=t[u].lazy;
        t[ls].lazy+=t[u].lazy;
        t[rs].lazy+=t[u].lazy;
        t[u].lazy=0;
    }
}

void build(int u,int L,int R){
    t[u].left=L;
    t[u].right=R;
    t[u].lazy=0;
    if(L==R){
        t[u].sum=a[L];
        t[u].val=a[L];
        t[u].lv=t[u].rv=a[L];
    }else{
        int M=(L+R)>>1;
        build(u*2,L,M);
        build(u*2+1,M+1,R);
        pushup(u);
    }
}

void update(int u,int l,int r,int x){
    if(l<=t[u].left && t[u].right<=r){
        t[u].sum+=(t[u].right-t[u].left+1)*x;
        t[u].val+=x;
        t[u].lv+=x;
        t[u].rv+=x;
        t[u].lazy+=x;
        return;
    }
    pushdown(u);
    int mid=(t[u].left+t[u].right)>>1;
    if(l<=mid) update(u*2,l,r,x);
    if(r>mid) update(u*2+1,l,r,x);
    pushup(u);
}
Node merge(Node a, Node b) {
    Node res;
    res.left = a.left;
    res.right = b.right;
    res.sum = a.sum + b.sum;
    res.lv = max(a.lv, a.sum + b.lv);  
    res.rv = max(b.rv, b.sum + a.rv);  
    res.val = max(max(a.val, b.val), a.rv + b.lv);  
    res.lazy = 0;  
    return res;
}
Node query(int u,int l,int r){
    if(l<=t[u].left && t[u].right<=r){
        return t[u];
    }
    pushdown(u);
    int mid=(t[u].left+t[u].right)>>1;
    if(r<=mid) return query(u*2,l,r);
    if(l>mid) return query(u*2+1,l,r);
    return merge(query(u*2,l,r), query(u*2+1,l,r));
}

int main(){
    cin >> n >> q;
    for(int i=1;i<=n;i++) cin >> a[i];
    build(1,1,n);
    while(q--){
        int op;
        cin >> op;
        if(op==1){
            int l,r,x;
            cin >> l >> r >> x;
            update(1,l,r,x);
        }else{
            int l,r;
            cin >> l >> r;
            Node res = query(1,l,r);
            cout << max(res.val,0) << endl;
        }
    }
    return 0;
}

不要以为你是管理员你就可以乱诬蔑人,不要以为你做不来就乱说别人。你没有证据!!!洛谷,就是管理员享有最高权力,你认为我是抄的,你就棕吧,你甚至可以封我的号。但是,群众的眼睛是雪亮的!!!!

如果你封了我,会让全天下的oiers知道,洛谷管理员的腐朽!!!

洛谷将会臭名昭著

2025/6/22 20:48
加载中...