线段树9pts求助,只有#1AC

P4513 小白逛公园

Dino_chx @ 2023-04-09 17:17:21

除了#1AC了,其他都WA了,请哪位大佬指点一下。十分感谢。


#include<bits/stdc++.h>
using namespace std;
const int N=1e7+7;
struct ST
{
    int l,r,sum,mx,lmx,rmx;
}tree[N<<2];
int w[N];
void pushup(ST &rt,ST &ls,ST &rs)
{
    rt.sum=ls.sum+rs.sum;
    rt.lmx=max(ls.lmx,ls.sum+rs.lmx);
    rt.rmx=max(rs.rmx,rs.sum+ls.rmx);
    rt.mx=max({ls.mx,rs.mx,ls.rmx+rs.lmx});
    return;
}
void pushup(int x)
{
    pushup(tree[x],tree[x<<1],tree[x<<1|1]);
    return;
}
void build(int x,int l,int r)
{
    if(l==r)
    {
        tree[x]={l,r,w[l],w[l],w[l],w[l]};
        return;
    }
    else
        tree[x].l=l,tree[x].r=r;
    int mid=l+r>>1;
    build(x<<1,l,mid);
    build(x<<1|1,mid+1,r);
    pushup(x);
    return;
}
void update(int x,int index,int k)
{
    if(tree[x].l==index&&tree[x].r==index)
    {
        tree[x]={index,index,k,k,k,k};
        return;
    }
    int mid=tree[x].l+tree[x].r>>1;
    if(x<=mid)
        update(x<<1,index,k);
    else
        update(x<<1|1,index,k);
    pushup(x);
    return;
}
ST query(int x,int l,int r)
{
    if(l<=tree[x].l&&r>=tree[x].r)
    return tree[x];
    int mid=tree[x].l+tree[x].r>>1;
    if(r<=mid)
        return query(x<<1,l,r);
    else if(l>mid)
        return query(x<<1|1,l,r);
    else
    {
        ST left=query(x<<1,l,r),right=query(x<<1|1,l,r),res;
        pushup(res,left,right);
        return res;
    }
}
int main()
{
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)scanf("%d",&w[i]);
    build(1,1,n);
    while(m--)
    {
        int op,l,r;
        scanf("%d%d%d",&op,&l,&r);
        if(op==1)
        {
            if(l>r)
            swap(l,r);
            printf("%d\n",query(1,l,r).mx);
        }
        else
        update(1,l,r);
    }
    return 0;
}

by diandian2020 @ 2023-04-09 17:21:08

w_i 或者修改的 p 初始是负数的时候,你的 lmxrmx 都应该是0(不选这个负数)


by diandian2020 @ 2023-04-09 17:21:40

当然 mx 还得是 w_i 或者 p,因为题目说了最少要选一个元素


by chenjunxiu @ 2023-04-09 17:23:11

至少选一个元素@clancysam


|