C. 【例题3】公园遛狗

C. 【例题3】公园遛狗

我们对于每一个线段树的节点,维护几个值

sum 表示当前区间的区间和

ml 表示最大前缀和

mr 表示最大后缀和

ans 表示当前区间的最大子段和

接下来我们来判断如何上传答案

首先假定 trlstrrs 已经做好了,然后考虑合并成 trp 的值

首先 trp.sum=trls.sum+trrs.sum 这个就是直接合并大区间

然后 trp.ml=max(trls.ml,trls.sum+trrs.ml)

trp.mr=max(trrs.mr,trrs.sum+trls.ml)

这个自行对照画图

trp.ans=max(max(trls.ans,trrs.ans),trls.mr+trrs.ml)

#include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 2e6 + 10; int n, m; struct node { int l, r; ll maxleft, maxright, sum, ans; } tr[N]; void pushon(int p) { tr[p].sum = tr[p * 2].sum + tr[p * 2 + 1].sum; tr[p].maxleft = max(tr[p * 2].maxleft, tr[p * 2].sum + tr[p * 2 + 1].maxleft); tr[p].maxright = max(tr[p * 2 + 1].maxright, tr[p * 2 + 1].sum + tr[p * 2].maxright); tr[p].ans = max(max(tr[p * 2].ans, tr[p * 2 + 1].ans), tr[p * 2].maxright + tr[p * 2 + 1].maxleft); } void build(int p, int l, int r) { tr[p].l = l, tr[p].r = r; if (l == r) { cin >> tr[p].sum; tr[p].maxleft = tr[p].maxright = tr[p].ans = tr[p].sum; return; } int mid = (l + r) >> 1; build(p * 2, l, mid); build(p * 2 + 1, mid + 1, r); pushon(p); } node ask(int p, int ql, int qr) { if (ql <= tr[p].l && tr[p].r <= qr) return tr[p]; int mid = (tr[p].l + tr[p].r) >> 1; if (qr <= mid) return ask(p * 2, ql, qr); else { if (ql > mid) return ask(p * 2 + 1, ql, qr); node t, a = ask(p * 2, ql, qr), b = ask(p * 2 + 1, ql, qr); t.maxleft = max(a.maxleft, a.sum + b.maxleft); t.maxright = max(b.maxright, a.maxright + b.sum); t.ans = max(max(a.ans, b.ans), a.maxright + b.maxleft); return t; } } void update(int p, int a, int x) { if (tr[p].l == tr[p].r) { tr[p].maxleft = tr[p].maxright = tr[p].ans = tr[p].sum = x; return; } int mid = (tr[p].l + tr[p].r) >> 1; if (a <= mid) update(p * 2, a, x); else update(p * 2 + 1, a, x); pushon(p); } int main() { cin >> n >> m; build(1, 1, n); while (m--) { int opt, x, y; cin >> opt >> x >> y; if (opt == 1) { if (x > y) swap(x, y); cout << ask(1, x, y).ans << endl; } else update(1, x, y); } return 0; }

__EOF__

本文作者ljfyyds
本文链接https://www.cnblogs.com/ljfyyds/p/17640725.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   ljfyyds  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示