我们对于每一个线段树的节点,维护几个值
表示当前区间的区间和
表示最大前缀和
表示最大后缀和
表示当前区间的最大子段和
接下来我们来判断如何上传答案
首先假定 和 已经做好了,然后考虑合并成 的值
首先 这个就是直接合并大区间
然后

这个自行对照画图

#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__
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)