• P4513 小白逛公园 动态维护最大子段和


    题目链接:https://www.luogu.org/problem/P4513

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    using namespace std;
    #define maxn 500005
    #define ll long long
    #define ls l,mid,rt<<1
    #define rs mid+1,r,rt<<1|1
    struct node{
        ll sum,lsum,rsum,msum;
    }tr[maxn<<2];
    ll a[maxn];
    inline void pushup(int rt)
    {
        tr[rt].sum=tr[rt<<1].sum+tr[rt<<1|1].sum;
        tr[rt].lsum=max(tr[rt<<1].lsum,tr[rt<<1].sum+tr[rt<<1|1].lsum);
        tr[rt].rsum=max(tr[rt<<1|1].rsum,tr[rt<<1|1].sum+tr[rt<<1].rsum);
        tr[rt].msum=max(max(tr[rt<<1].msum,tr[rt<<1|1].msum),tr[rt<<1|1].lsum+tr[rt<<1].rsum);
    }
    inline void build(int l,int r,int rt)
    {
        if(l==r)
        {
            tr[rt].sum=tr[rt].msum=tr[rt].lsum=tr[rt].rsum=a[l];
            return ;
        }
        int mid=l+r>>1;
        build(ls);build(rs);
        pushup(rt);
    }
    inline void update(int L,int c,int l,int r,int rt)
    {
        if(l==r)
        {
            tr[rt].sum=tr[rt].msum=tr[rt].lsum=tr[rt].rsum=c;
            return ;
        }
        int mid=l+r>>1;
        if(L<=mid)update(L,c,ls);
        else update(L,c,rs);
        pushup(rt);
    }
    inline node query(int L,int R,int l,int r,int rt)
    {
        if(L<=l&&R>=r)return tr[rt];
        int mid=l+r>>1;
        if(R<=mid)return query(L,R,ls);
        else if(L>mid)return query(L,R,rs);
        else
        {
            node wl=query(L,R,ls),wr=query(L,R,rs),ans;
            ans.lsum=max(wl.lsum,wl.sum+wr.lsum);
            ans.rsum=max(wr.rsum,wr.sum+wl.rsum);
            ans.msum=max(max(wl.msum,wr.msum),wl.rsum+wr.lsum);
            return ans;
        }
    }
    int main()
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        scanf("%lld",&a[i]);
        build(1,n,1);
        int op,l,r,x;
        for(int i=1;i<=m;i++)
        {
            scanf("%d",&op);
            if(op==1)
            {
                scanf("%d%d",&l,&r);
                if(l>r)swap(l,r);
                printf("%lld
    ",query(l,r,1,n,1).msum);
            }
            else
            {
                scanf("%d%d",&l,&x);
                update(l,x,1,n,1);
            }
        }
        return 0;
    }
  • 相关阅读:
    Builder与Factory,殊途同归!
    IIS中的身份验证
    如何给项目选择合适语言(转)
    动态行转列
    ORACLE系统表大全(转)
    C# 操作Word文档(转)
    产品化思维之分层的思想
    开发管理目前开发工作的问题分析和诊断
    MongoDB数据插入、删除、更新、批量更新某个字段
    学习正则表达式
  • 原文地址:https://www.cnblogs.com/chen99/p/11388859.html
Copyright © 2020-2023  润新知