求助一道站外题
  • 板块题目总版
  • 楼主NightTide
  • 当前回复0
  • 已保存回复0
  • 发布时间2021/8/13 21:54
  • 上次更新2023/11/4 10:45:42
查看原帖
求助一道站外题
547908
NightTide楼主2021/8/13 21:54

题面: 给定长度为N的数列A,以及M条指令 (N≤500000, M≤100000),每条指令可能是以下两种之一:

2xy2\,x\,y,把 A[x] 改成 y。

1xy1\,x\,y,查询区间 [x,y] 中的最大连续子段和。

对于每个询问,输出一个整数表示答案。 这是我的代码,想知道为什么错了,用的线段树

#include<bits/stdc++.h>
#define MAXN 500010
using namespace std;
struct seg{
    long long max_right;
    long long max_left;
    long long max_now;
    long long r,l,sum;
};
long long a[MAXN];
seg tree[MAXN*4];
long long n,m;
long long type,x,y;
void up(long long now){
    tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
    tree[now].max_left=max(tree[now*2].max_left,tree[now*2].sum+tree[now*2+1].max_left);
    tree[now].max_right=max(tree[now*2+1].max_right,tree[now*2+1].sum+tree[now*2].max_right);
    tree[now].max_now=max(tree[now*2+1].max_left+tree[now*2].max_right,max(tree[now*2].max_now,tree[now*2+1].max_now));
}
void update(long long now,long long x,long long y){
    long long l=tree[now].l,r=tree[now].r,mid=(l+r)/2;
    if(l==r){
        tree[now].sum=tree[now].max_left=tree[now].max_right=tree[now].max_now=y;
        return ;
    }
    if(l==x&&l==r){
        tree[now].sum=tree[now].max_left=tree[now].max_right=tree[now].max_now=y;
        up(now);
        return ;
    }
    if(x<=mid){
        update(now*2,x,y);
    }else{
        update(now*2+1,x,y);
    }
    up(now);
}
void build(long long now,long long l,long long r){
    tree[now].l=l;tree[now].r=r;
    long long mid=(r+l)/2;
    if(l==r){
        tree[now].sum=tree[now].max_left=tree[now].max_right=tree[now].max_now=a[l];
        return ;
    }
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
    up(now);
}
seg query(long long now,long long x,long long y){
    long long l=tree[now].l,r=tree[now].r,mid=(l+r)/2;
    if(l==r){
        return tree[now];
    }
    if(x==l&&y==r){
        return tree[now];
    }
    if(y<=mid){
        return query(now*2,x,y);
    }else if(x>mid){
        return query(now*2+1,x,y);
    }else{
        seg u,v,w;
        u=query(now*2,x,mid);
        v=query(now*2+1,mid+1,y);
        w.sum=u.sum+v.sum;
        w.max_left=max(u.max_now,u.sum+v.max_left);
        w.max_right=max(v.max_now,v.sum+u.max_right);
        w.max_now=max(u.max_right+v.max_left,max(u.max_now,v.max_now));
        return w;
    }
}
int main(){
    scanf("%lld%lld",&n,&m);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    while(m--){
        scanf("%lld%lld%lld",&type,&x,&y);
        if(type==1){
            if(x>y) swap(x,y);
            printf("%lld\n",query(1,x,y).max_now);
        }else{
            update(1,x,y);
        }
    }
}
2021/8/13 21:54
加载中...