2026 Summer Day8
P4563 [JXOI2018] 守卫
题目大概就是给你一个高度序列 ,你可以在一些位置 上安插守卫,如果 且 和 的连线不被任何山峰阻挡,则在 的守卫可以看到位置 ,求让所有位置都被监视的最小守卫数量。
令 表示区间 内满足条件的最小守卫数量。通过观察,我们不难发现以下性质:
-
设位置 能看到的位置为 ,则 和 的连线的鞋履一定小于 和 的连线。
-
区间 要满足条件,则位置 上一定要放置守卫。
-
是一个子问题。
这样我们就可以转移了:
然后我们只需要变换内存能循环的枚举顺序就可以通过这道题了。复杂度 。
P10967/P4767 [IOI 2000] 邮局
一个很显然的 DP 状态定义是令 表示在前 个村庄中放置 个邮局获得的最小距离和。转移也很显然:
这里的 表示在区间 中放置一个邮局获得的最小距离和,可以预处理,复杂度 ,可以通过原版题目。
加强版的数据范围扩大到了 ,世界 DP 显然过不了,需要考虑优化。
其实可以感性理解一下,如果原本的状态为 ,我们现在新增一个邮局 ,那么这个答案显然是会小于 的,同理,如果我们由状态 转移至 ,这个答案显然是会大于 的,所以这里我们就有一个类似单调性的性质,每次转移的时候记录一下转移的位置,下一次转移的时候从这个位置开始,复杂度 。大概长这样:
for (int i = 1; i <= P; i++) { from[V + 1][i] = V; for (int j = V; j >= 1; j--) { int p = 0; for (int k = from[j][i - 1]; k <= from[j + 1][i]; k++) { if (dp[k][i - 1] + w[k + 1][j] < dp[j][i]) dp[j][i] = dp[k][i - 1] + w[k + 1][j], p = k; } from[j][i] = p; } }后来发现这个是 四边形不等式,不过还没太搞懂。TODO
Comments
Quiet notes for this article.