思维题单刷题记录
P6005 [USACO20JAN] Time is Mooney G
Description
有 个城市,之间通过 条单向道路来连接,每次到达城市 可以获得 。每次移动消耗一天,且移动 天需要花费 。
从城市 出发,最后回到城市 ,要求求出可以获得的最大值。
Solution
考虑dp做法。我们设 表示在出差的第 天,当前所在城市编号是 时的最大贡献。那么最后的答案就是所有的 的最大值。
考虑状态转移,显然,对于当前城市 ,可以从符合存在 的城市 转移。所以建图的时候可以建反向边来帮助转移。
那么转移方程就是:
其中 满足存在 的边。
细节
- 初始化时,。所有的节点都要初始化为 ,表示在第 天时不可能在城市 。
- 的最大值可以直接设为 ,因为在最极限的情况下, 也会使得 。
P8186 [USACO22FEB] Redistributing Gifts S
Description
给定 个礼物和 头奶牛,对于每头奶牛而言,它会有一个愿望单排列 ,表示它希望收到的礼物编号。奶牛喜欢获得出现在愿望单中更早的礼物。
最初第 号礼物对应第 头奶牛,请重新分配礼物,使得每头奶牛都可以获得跟原来一样或者更好的礼物。
Solution
先考虑什么情况下奶牛可以获得更优的礼物。对于奶牛 ,假设其可以获得的更优的礼物编号是 ,那么奶牛 由于没有了礼物需要换为一个更优的礼物 。以此类推,只有当某一头奶牛的更优礼物是编号 时,所有路径上的奶牛才能获得更优的礼物。
不难发现,此时会形成一个环。那么我们只需要使用Floyd判环即可。
Floyd判环
Floyd 算法通过不断枚举中间点,来更新所有点对之间的最短路径。
具体过程类似DP,设 表示从 到 的最短路径长度。那么转移方程就是:
其中 是枚举的中间点。
同理,我们可以使用Floyd判环来判断是否存在环。我们可以把 看作从 到 之间是否存在路径。那么转移方程就是:
其中 是枚举的中间点。
如果在枚举完所有中间点后, 为 ,那么就说明存在环。
P7149 [USACO20DEC] Rectangular Pasture S
Description
在一个二维方阵中,有 个点,每个点有一个坐标 。
可以选择一个矩形,请求出可以包围在这个矩形之中的不同的点子集的数量。空集也算作一种答案。
Solution
首先,题目的坐标范围都是 ,且根据题目,每行每列最多只会有一个点。那么我们可以通过离散化,把方阵缩小到一个 的方阵,每个点分别对应 。
由于相同的点集算作一种答案,那么只需要枚举最小矩形即可。
那么我们可以枚举矩形的上下边界 ,设上下对应的左右边界 。
显然,对于 和 之间的所有点,如果横坐标在 之间,那么这个点就会被包含在矩形之中,无法额外产生贡献。
所以只需要统计矩形左边和右边的点的数量,然后通过乘法定理来统计答案即可。
统计矩形左边和右边的点的数量可以在离散化之后,使用二维前缀和或者树状数组来统计。
注意空集也算一种答案,所以最终的答案数要加上 。