萌新求教

P4513 小白逛公园

Miss_dijkstra @ 2019-06-17 20:20:21

#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
int tr[N*4];
int lm[N*4],rm[N*4];//更新 左 or 右 端点开始的最大子段和
int maxn[N*4];//更新最大子段和的答案。分三种情况:最大子段只在mid左边,跨过mid,只在mid右边。
int n,m;
int a[N*4];
void pushup(int i)
{
    tr[i]=tr[i<<1]+tr[(i<<1)+1];
    maxn[i]=max(max(maxn[i<<1],maxn[(i<<1)+1]),rm[i<<1]+lm[(i<<1)+1]);
    lm[i]=max(lm[i<<1],tr[i<<1]+lm[(i<<1)+1]);
    rm[i]=max(rm[(i<<1)+1],tr[(i<<1)+1]+rm[(i<<1)]);
    return;
}
void update(int i,int l,int r,int x,int val)
{
    if(l==r)
    {
        tr[i]=val;
        maxn[i]=val;
        lm[i]=val;
        rm[i]=val;
        return;
    }
    int mid=l+r>>1;
    if(mid>=x) update(i<<1,l,mid,x,val);
    else update((i<<1)+1,mid+1,r,x,val);
    pushup(i);
}
void built(int i,int l,int r)
{
    if(l==r)
    {
        tr[i]=a[l];
        maxn[i]=a[l];
        lm[i]=a[l];
        rm[i]=a[l];
        return ;
    }
    int mid=l+r>>1;
    built(i<<1,l,mid);
    built((i<<1)+1,mid+1,r);
    pushup(i);
}
int L,R,sum;
int run(int i,int l,int r,int x,int y)
{
    //cout<<"adasdas"<<l<<" "<<r<<" "<<x<<" "<<y<<endl;
    //if(l==2&&r==2&&x==3&&y==2) system("pause");
    if(l==x&&r==y)
    {
        sum=tr[i];
        L=lm[i];
        r=rm[i];
        return maxn[i];
    }
    int mid=l+r>>1;
    if(mid>=y)
        return run(i<<1,l,mid,x,y);//只在mid右边
    else if(mid<x)
        return run((i<<1)+1,mid+1,r,x,y);//只在mid左边
    else//跨过mid
    {
        int tmp=run(i<<1,l,mid,x,mid);
        int jxx=L,cjr=R,hj=sum;
        int ans=max(tmp,run((i<<1)+1,mid+1,r,mid+1,y));
        ans=max(ans,cjr+L);
        L=max(jxx,hj+L);
        R=max(R,sum+cjr);
        return ans;
        /*
        int jxx=L,cjr=R,hj=sum;
        int ans=max(run(i<<1,l,mid,x,mid),run((i<<1)+1,mid+1,r,mid+1,y));
        ans=max(ans,cjr+L);
        L=max(jxx,hj+L);
        R=max(R,sum+cjr);
        return ans;
        */
    }

}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
        cin>>a[i];
        //build(1,1,n,i,x);
    built(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int x,y,op;
        cin>>op>>x>>y;
        if(op==1)
        {
            if(x>y) swap(x,y);
            cout<<run(1,1,n,x,y)<<endl;
        }
        if(op==2)
        {
            update(1,1,n,x,y);
        }
    }
    return 0;
}

by RedreamMer @ 2019-06-17 20:58:57

楼主内心是崩溃的


by Miss_dijkstra @ 2019-06-17 21:03:11

@Mer_

我 亦 从 来 诗 句 好

问 君 何 处 是 神 仙

题 名 自 有 丹 青 笔

的 的 真 成 造 化 权


by Retired_lvmao @ 2019-06-17 21:06:41

@Mer_

请君为我听一言
别看大佬秀操作
说三到四也没用
话归正题去写题

by qwaszx @ 2019-06-17 21:07:06

@托儿索 您run里面sum是不是没合并啊QAQ


by Miss_dijkstra @ 2019-06-18 08:06:57

@qwaszx sum需要合并吗


by Miss_dijkstra @ 2019-06-18 08:07:50

我 来 老 子 知 何 处

太 古 春 风 又 一 时

弱 水 只 今 成 底 事

了 无 车 马 到 东 篱


by chdy @ 2019-06-18 11:26:21

@托儿索 你合并的时候绝对出错了,自己再看看


by Miss_dijkstra @ 2019-06-18 12:02:27

@chdy 好吧


上一页 |