CF115E Linear Kingdom Races
做过的原题不会 该反思了。
做法一
考虑
那么如果不修这条路 就有
如果修了这条路 考虑把含
设
那么就有
考虑线段树优化 DP 首先我们把所有路按右端点排序
然后线段树的第
那么我们考虑右移
首先有
其次有
最后更新
这样转移直接查区间
#include <bits/stdc++.h>
#define ls (k << 1)
#define rs (k << 1 | 1)
#define mid (l + r >> 1)
#define ll long long
#define int long long
using namespace std;
namespace steven24 {
const int N = 2e5 + 0721;
const ll inf = 0x7ffffffffffffff;
int v[N];
ll f[N];
int n, m;
struct node {
int l, r, p;
friend bool operator<(node x, node y) {
return x.r < y.r;
}
} race[N];
struct tree {
ll tr[N << 2], lazy[N << 2];
inline void pushup(int k) {
tr[k] = max(tr[ls], tr[rs]);
}
void add(int k, int val) {
tr[k] += val;
lazy[k] += val;
}
void pushdown(int k) {
add(ls, lazy[k]);
add(rs, lazy[k]);
lazy[k] = 0;
}
void modify(int k, int l, int r, int val, int u, int v) {
if (u <= l && v >= r) {
add(k, val);
return;
}
if (lazy[k]) pushdown(k);
if (u <= mid) modify(ls, l, mid, val, u, v);
if (v > mid) modify(rs, mid + 1, r, val, u, v);
pushup(k);
}
void give(int k, int l, int r, int val, int loc) {
if (l == r) {
tr[k] = val;
return;
}
if (lazy[k]) pushdown(k);
if (loc <= mid) give(ls, l, mid, val, loc);
else give(rs, mid + 1, r, val, loc);
pushup(k);
}
ll query(int k, int l, int r, int u, int v) {
if (u <= l && v >= r) {
return tr[k];
}
if (lazy[k]) pushdown(k);
ll ret = -inf;
if (u <= mid) ret = max(ret, query(ls, l, mid, u, v));
if (v > mid) ret = max(ret, query(rs, mid + 1, r, u, v));
pushup(k);
return ret;
}
} seg;
void dp() {
int prs = 1;
for (int i = 1; i <= n; ++i) {
seg.modify(1, 1, n, -v[i], 1, i);
while (prs <= m && race[prs].r == i) {
seg.modify(1, 1, n, race[prs].p, 1, race[prs].l);
++prs;
}
f[i] = max(f[i - 1], seg.query(1, 1, n, 1, i));
seg.give(1, 0, n, f[i], i + 1);
}
}
void main() {
scanf("%lld%lld", &n, &m);
for (int i = 1; i <= n; ++i) scanf("%lld", &v[i]);
for (int i = 1; i <= m; ++i) scanf("%lld%lld%lld", &race[i].l, &race[i].r, &race[i].p);
sort(race + 1, race + 1 + m);
dp();
printf("%lld", f[n]);
}
}
signed main() {
steven24::main();
return 0;
}
/*
7 4
3 2 3 2 1 2 3
1 2 5
2 3 5
3 5 3
7 7 5
*/
做法二
来自 @KHIN
考虑
特别地 定义
考虑转移 枚举
其中
对于
考虑线段树优化 DP 考虑
首先大家都要减去
然后考虑每个右端点在
所以我们转移的时候先记录
然后更新
最后把
即先转移有限制的 再转移无限制的
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!