2025.02.22 CW 模拟赛 B. 美食节
B. 美食节
思路
令 \(f_{i, j}\) 表示第 \(i\) 个活动后在 \(j\) 的最小疲劳值.
对于每一个 \(f_{i, j}\), 先从 \(f_{i - 1, j}\) 赋值过来, 接下来由两部分贡献.
第一部分:
\[f_{i, j} = f_{i - 1, j} +
\begin{cases}
l_i - j & j < l_i \\
j - r_i & j > r_i
\end{cases}
\]
第二部分对于移动的贡献, 我们使用 \(f_{i, j} + 1\) 更新 \(f_{i, j \pm 1}\).
事实上, 如果我们对于 \(f_{i, j}\) 进行差分, 那么只会有 -1, 0, 1 这三段.
归纳证明一下. \(i = 0, f_{i, j} = |j - x|\), 显然成立. 当 \(i\) 增大时, 第一部分计算会让函数再加上一个差分为 -1, 0, 1 的函数, 也就是 \(f_{i, j}\) 差分会变成 -2, -1, 0, 1, 2; 但是第二部分的贡献又会使函数的差分绝对值不超过 1, 又变回 -1, 0, 1.
这样, 差分值为 0 的段便为最小答案, 用两个变量维护即可. 时间复杂度 \(\mathcal{O}(n)\).
read(n, l), r = l;
for (int i = 1, x, y; i <= n; ++i) {
read(x, y);
if (r < x) ans += x - r, l = r, r = x;
else if (l > y) ans += l - y, r = l, l = y;
else l = max(l, x), r = min(r, y);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现