题目描述

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

分析

必须要清楚,线段树中\(pushup\)操作只能是从儿子节点传递到父亲节点。如果要A掉这道题,绝对不能用线段树父亲节点来更新自己的任何值,不然会错到飞起。
那么回到这道题目,我们记录\(lm,rm,s,res\),分别表示从区间左端开始的最大子段和,从区间右边开始的最大子段和,区间和,和答案。
那么我们每次考虑的思路都是通过mid和不通过mid来合并两个节点的答案。

ac代码

#include <bits/stdc++.h>
#define ll long long
#define ms(a, b) memset(a, b, sizeof(a))
#define inf 0x3f3f3f3f
#define N 500005
using namespace std;
template <typename T>
inline void read(T &x) {
    x = 0; T fl = 1;
    char ch = 0;
    while (ch < '0' || ch > '9') {
        if (ch == '-') fl = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9') {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    x *= fl;
}
struct segment_tree {
    #define ls (nod<<1)
    #define rs (nod<<1|1)
    #define mid ((l+r)>>1)
    struct node {
        int s, lm, rm, l, r, res;
    }tr[N << 2];
    void pushup(int nod) {
        tr[nod].s = tr[ls].s + tr[rs].s;
        tr[nod].lm = max(tr[ls].lm, tr[rs].lm + tr[ls].s);
        tr[nod].rm = max(tr[rs].rm, tr[ls].rm + tr[rs].s);
        tr[nod].res = max(max(tr[rs].res, tr[ls].res), tr[ls].rm + tr[rs].lm);
    }
    void build(int l, int r, int nod, int *a) {
        tr[nod].l = l, tr[nod].r = r;
        if (l == r) {
            tr[nod].lm = tr[nod].rm = tr[nod].res = tr[nod].s = a[l];
            return;
        }
        build(l, mid, ls, a);
        build(mid + 1, r, rs, a);
        pushup(nod);
    }
    void update_point(int nod, int k, int v) {
        int l = tr[nod].l, r = tr[nod].r;
        if (l == r) {
            tr[nod].lm = tr[nod].res = tr[nod].rm = tr[nod].s = v;
            return;
        }
        if (k <= mid) update_point(ls, k, v);
        else update_point(rs, k, v);
        pushup(nod);
    }
    node query(int nod, int ql, int qr) {
        int l = tr[nod].l, r = tr[nod].r;
        if (ql <= l && r <= qr)
            return tr[nod];
        if (qr <= mid) return query(ls, ql, qr);
        else if (ql > mid) return query(rs, ql, qr);
        else {
            node tmp, tmp1 = query(ls, ql, mid), tmp2 = query(rs, mid + 1, qr);
            tmp.lm = max(tmp1.lm, tmp1.s + tmp2.lm);
            tmp.rm = max(tmp2.rm, tmp2.s + tmp1.rm);
            tmp.res = max(max(tmp1.res, tmp2.res), tmp1.rm + tmp2.lm);
            return tmp;
        }
    }
}tr;
int a[N];
int n, m;
int main() {
    read(n); read(m);
    for (int i = 1; i <= n; i ++) read(a[i]);
    tr.build(1, n, 1, a);
    while (m--) {
        int opt, x, y;
        read(opt); read(x); read(y);
        if (opt == 1) {
            if (x > y) swap(x, y);
            printf("%d\n", tr.query(1, x, y).res);
        }
        else tr.update_point(1, x, y);
    }
    return 0;
}

[luogu4513]小白逛公园的更多相关文章

  1. [vijos P1083] 小白逛公园

    不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...

  2. Bzoj 1756: Vijos1083 小白逛公园 线段树

    1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 1021  Solved: 326[Submit][Statu ...

  3. BZOJ 1756: Vijos1083 小白逛公园

    题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 856  Solved: 264[Submit][Sta ...

  4. JDOJ-P1260 VIJOS-P1083 小白逛公园

    首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec  Memor ...

  5. 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园

    题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...

  6. 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)

    P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...

  7. vijos1083:小白逛公园

    小白逛公园 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的 ...

  8. 小白逛公园加强版(park)

    小白逛公园加强版(park) 题目描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦--在小新家附近有n个公园,这些公园通过一些路径相连,并保证每两个公园之间有且仅有一条通路相连(也就是说这是一棵树), ...

  9. TYVJ1427 小白逛公园

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述     小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个 ...

随机推荐

  1. WPF CheckBox 滑块 样式 开关

    原文:WPF CheckBox 滑块 样式 开关 效果图 样式代码 <Style x:Key="CheckRadioFocusVisual"> <Setter P ...

  2. 【已解决】HeidiSQL连接(登录)MySQL数据库报错10061问题

    解决方法: 打开cmd->输入命令services.msc 然后打开即可解决.

  3. Jmeter(二十八)_Docker+Jmeter+Gitlab+Jenkins+Ant(容器化的接口自动化持续集成平台)

    这套接口自动化持续集成环境已经部署差不多了,现在说说我的设计思路 1:利用Docker容器化Gitlab,Jenkins,Jmeter,Ant,链接如下 Docker_容器化gitlab Docker ...

  4. Mysql优化系列(1)--Innodb重要参数优化

    1.简单介绍InnoDB给MySQL提供了具有提交,回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎.InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读.这些特色 ...

  5. mysqldump数据导出问题和客户端授权后连接失败问题

    1,使用mysqldump时报错(1064),这个是因为mysqldump版本太低与当前数据库版本不一致导致的.mysqldump: Couldn't execute 'SET OPTION SQL_ ...

  6. Python_闭包_27

    #闭包:嵌套函数,内部函数 并且必须调用外部函数的变量 def outer(): a = 1 def inner(): print(a) inner() print(inner.__closure__ ...

  7. linux第二次读书笔记

    <Linux内核设计与实现>读书笔记 第五章 系统调用   第五章系统调用 系统调用是用户进程与内核进行交互的接口.为了保护系统稳定可靠,避免应用程序恣意忘形. 5.1与内核通信 系统调用 ...

  8. 作业七:Linux内核如何装载和启动一个可执行程序

    作业七:Linux内核如何装载和启动一个可执行程序 一.编译链接的过程和ELF可执行文件格式 可执行文件的创建——预处理.编译和链接 在object文件中有三种主要的类型. 一个可重定位(reloca ...

  9. Hibernate_HQL

    public class According_condition { public static void main(String[]args){ Session session=HibernateU ...

  10. 第三次Sprint-最后冲刺

    由于一些原因,导致我和汝婷被退队了.因此我们是从上星期重新开始做系统. 陈汝婷单独负责: 1.用户输入题目数: 2.限制题数: 3.自动生成用户需要题目数的题目: 4.计时 练丽云单独: 1.异常处理 ...