[luogu4513]小白逛公园
题目描述
在小新家附近有一条“公园路”,路的一边从南到北依次排着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]小白逛公园的更多相关文章
- [vijos P1083] 小白逛公园
不知怎地竟有种错觉此题最近做过= =目测是类似的?那道题貌似是纯动归? 本来今晚想做两道题的,一道是本题,一道是P1653疯狂的方格取数或NOI08 Employee,看看现在的时间目测这个目标又达不 ...
- Bzoj 1756: Vijos1083 小白逛公园 线段树
1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 1021 Solved: 326[Submit][Statu ...
- BZOJ 1756: Vijos1083 小白逛公园
题目 1756: Vijos1083 小白逛公园 Time Limit: 10 Sec Memory Limit: 64 MBSubmit: 856 Solved: 264[Submit][Sta ...
- JDOJ-P1260 VIJOS-P1083 小白逛公园
首先,在这里给大家推荐一个网站,https://neooj.com:8082,这是我母校的网站 言归正传,题目描述 VIJOS-P1083 小白逛公园 Time Limit: 1 Sec Memor ...
- 线段树 || BZOJ1756: Vijos1083 小白逛公园 || P4513 小白逛公园
题面:小白逛公园 题解: 对于线段树的每个节点除了普通线段树该维护的东西以外,额外维护lsum(与左端点相连的最大连续区间和).rsum(同理)和sum……就行了 代码: #include<cs ...
- 洛谷 P4513 小白逛公园-区间最大子段和-分治+线段树区间合并(单点更新、区间查询)
P4513 小白逛公园 题目背景 小新经常陪小白去公园玩,也就是所谓的遛狗啦… 题目描述 在小新家附近有一条“公园路”,路的一边从南到北依次排着nn个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩 ...
- vijos1083:小白逛公园
小白逛公园 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个公园,小白早就看花了眼,自己也不清楚该去哪些公园玩了. 一开始,小白就根据公园的 ...
- 小白逛公园加强版(park)
小白逛公园加强版(park) 题目描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦--在小新家附近有n个公园,这些公园通过一些路径相连,并保证每两个公园之间有且仅有一条通路相连(也就是说这是一棵树), ...
- TYVJ1427 小白逛公园
时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 小新经常陪小白去公园玩,也就是所谓的遛狗啦…在小新家附近有一条“公园路”,路的一边从南到北依次排着n个 ...
随机推荐
- DeskMini无传统机械键盘与鼠标接口的情况下使用U盘安装系统经验总结
总结安装纯净版Win7旗舰版系统安装过程所解决的问题要点: 1:UEFI引导启动的实现. 2:使用Dism++实现系统的安装. 3:使用Dism++解决新主板在安装系统过程中不能使用USB键盘和鼠标的 ...
- Luogu P1514 引水入城
我承认我有点懒(洛谷已经发过题解了,但我发誓要坚持写博客) 这道题坑了我3天…… 首先一看就与染色问题类似,果断BFS(写DFS炸了) 先将最上面(靠近水)的一行全部扔进队列里,做一遍BFS 再对最下 ...
- python 的zip 函数小例子
In [57]: name = ('Tome','Rick','Stephon') In [58]: age = (45,23,55) In [59]: for a,n in zip (name,ag ...
- PowerBI开发 第十五篇:DAX 表达式(时间+过滤+关系)
DAX表达式中包含时间关系(Time Intelligence)相关的函数,用于对日期维度进行累加.同比和环比等分析.PowerBI能够创建关系,通过过滤器来对影响计算的上下文. 一,时间关系 DAX ...
- .NetCore实践篇:分布式监控Zipkin持久化之殇
前言 本系列已写了四篇文章,读本篇之前,可以先读前面几篇. 思考大纲:.Net架构篇:思考如何设计一款实用的分布式监控系统? 实践篇一:.NetCore实践篇:分布式监控客户端ZipkinTracer ...
- .net core实践系列之短信服务-Sikiro.SMS.Bus服务的实现
前言 前两篇<.net core实践系列之短信服务-Sikiro.SMS.Api服务的实现>.<.net core实践系列之短信服务-Api的SDK的实现与测试>分别讲解了AP ...
- vue开发小结(下)
前言 继前几天总结了vue开发小结(上)后,发现还有很多的点没有能列举出来,于是还是打算新建一个下篇,再补充一些vue开发中需要注意的细节,确实还是都是细节的问题,我只是在这里强调下,希望对大家有帮助 ...
- 【数据库】Mysql中主键的几种表设计组合的实际应用效果
写在前面 前前后后忙忙碌碌,度过了新工作的三个月.博客许久未新,似乎对忙碌没有一点点防备.总结下来三个月不断的磨砺自己,努力从独乐乐转变到众乐乐,体会到不一样的是,连办公室的新玩意都能引起莫名的兴趣了 ...
- 老牌阅读器nook2刷机整理
kindle肯定是现在大多数人了解电纸书这个产品的开端,也给我留下了一段美好的回忆,不折腾,不死机,官方书城让人省心不少,不过作为半个折腾爱好者,kindle显然不符合我的理念,遂慢慢入了安卓电纸书的 ...
- Houdini toolset environment variable setting
Game Development Toolset HOUDINI_PATH = "C:\Users\fooldrifter\Documents\houdini17.5\GameDevelop ...