luogu P4513 小白逛公园 (区间合并)

链接:https://www.luogu.org/problemnew/show/P4513

思路: 很基础的区间合并,开四个数组:

num: 区间数字的和

lsum:从左端点起最大连续字段和

rsum:从右端点起最大连续字段和

sum:区间最大连续字段和

然后按照以前合并的思路合并下就完事了。

好久没写区间合并的题。。还被卡了一阵子,属实弟弟

实现代码;

#include<bits/stdc++.h>
using namespace std;
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
#define ls rt<<1
#define rs rt<<1|1
const int M = 1e6+10;
struct node{
    int sum,lsum,num,rsum;
}t[M<<2];

void pushup(int rt){
    t[rt].num = t[ls].num + t[rs].num;
    t[rt].sum = max(t[ls].sum,t[rs].sum);
    t[rt].lsum = max(t[ls].lsum,t[rs].lsum+t[ls].num);
    t[rt].rsum = max(t[rs].rsum,t[ls].rsum+t[rs].num);
    t[rt].sum = max(t[rt].sum,t[ls].rsum+t[rs].lsum);
}

void update(int p,int c,int l,int r,int rt){
    if(l == r){
        t[rt].sum = t[rt].lsum = t[rt].rsum = t[rt].num = c;
        return ;
    }
    int mid = (l + r) >> 1;
    if(p <= mid) update(p,c,lson);
    else update(p,c,rson);
    pushup(rt);
}

node query(int L,int R,int l,int r,int rt){
    if(L<=l&&R>=r){
        return t[rt];
    }
    int mid = (l + r) >> 1;
    if(R <= mid) return query(L,R,lson);
    else if(L > mid) return query(L,R,rson);
    else{
        node t1 = query(L,R,lson),t2 = query(L,R,rson),ret;
        ret.lsum = max(t1.lsum,t2.lsum+t1.num);
        ret.rsum = max(t2.rsum,t1.rsum+t2.num);
        ret.sum = max(max(t1.sum,t2.sum),t1.rsum+t2.lsum);
        return ret;
    }
}

int main()
{
    int n,q,x,y,op;
    scanf("%d%d",&n,&q);
    for(int i = 1;i <= n;i ++)
        scanf("%d",&x),update(i,x,1,n,1);
    while(q--){
        scanf("%d%d%d",&op,&x,&y);
        if(op == 1){
            if(y < x) swap(x,y);
            printf("%d\n",query(x,y,1,n,1).sum);
        }
        else{
            update(x,y,1,n,1);
        }
    }
    return 0;
}

原文地址:https://www.cnblogs.com/kls123/p/10803375.html

时间: 2024-08-03 07:12:32

luogu P4513 小白逛公园 (区间合并)的相关文章

$Luogu$ $P4513$ 小白逛公园

链接 背景 \(huhao\) , \(Luogu\) \(P4513\) 题意 给定一个数列,要求单点修改.区间查询最大子段和. 解法 线段树模板.维护每个区间和 \(sum\) .区间最大子段和 \(val\) .区间从左端点开始向右的最大子段和 \(lmax\) .区间从右端点开始向左的最大子段和 \(rmax\) . \(trick\) 查询时先加入一个节点,后来查询到的节点直接与该节点比较更新即可. 细节 \(1.\) 建树和修改时各个信息均要赋值.(好傻逼的错误啊) \(2.\) 查

luogu P4513 小白逛公园 2019.8.2

2019.8.2//by AndyZ #include<cstdio> #include<iostream> #define rint register int #define ls p<<1 #define rs p<<1|1 using namespace std; const int N=5e5+5; int n,m; int a[N]; struct SegmentTree{ int l,r,dat; int lmax,rmax,maxn; }t[N

JDOJ-1260: VIJOS-P1083 小白逛公园

1260: VIJOS-P1083 小白逛公园 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 329  Solved: 94[Submit][Status][Web Board] Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了.         一开始,小白就根据公园的风景给每个公园打了分.小新为了省事,每次遛狗的时候

TYVJ1427 小白逛公园

P1427 小白逛公园 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了.    一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯

线段树--小白逛公园nkoj1316

小白逛公园 Time Limit:20000MS  Memory Limit:65536K Case Time Limit:2000MS Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的

bzoj1756 Vijos1083 小白逛公园

1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MB Description 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白

【BZOJ】1756【VIJOS】1083小白逛公园

描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦-在小新家附近有一条"公园路",路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择连续的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯.同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化. 那么,就请你来帮小白选择公园

Vijos 1083 小白逛公园(线段树)

线段树,每个结点维护区间内的最大值M,和sum,最大前缀和lm,最大后缀和rm. 若要求区间为[a,b],则答案max(此区间M,左儿子M,右儿子M,左儿子rm+右儿子lm). --------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<

Vijos 小白逛公园 线段树加DP

描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的风景给每个公园打了分-.-.小新为了省事,每次遛狗的时候都会事先规定一个范围,小白只可以选择第a个和第b个公园之间(包括a.b两个公园)选择**连续**的一些公园玩.小白当然希望选出的公园的分数总和尽量高咯.同时,由于一些公园的景观会有所改变,所以,小白的打分也可能会有一些变化. 那么,就请你来帮小白选择公园吧