990 字
5 分钟

思维题单刷题记录

P6005 [USACO20JAN] Time is Mooney G#

题目链接

Description#

NN 个城市,之间通过 MM 条单向道路来连接,每次到达城市 ii 可以获得 mim_i。每次移动消耗一天,且移动 TT 天需要花费 C×T2C\times T^2

从城市 11 出发,最后回到城市 11,要求求出可以获得的最大值。

Solution#

考虑dp做法。我们设 fi,jf_{i,j} 表示在出差的第 ii 天,当前所在城市编号是 jj 时的最大贡献。那么最后的答案就是所有的 fi,1f_{i,1} 的最大值。

考虑状态转移,显然,对于当前城市 jj,可以从符合存在 kjk\rightarrow j 的城市 kk 转移。所以建图的时候可以建反向边来帮助转移。

那么转移方程就是:

fi,j=max(fi1,k+mj,fi,j)f_{i,j}=\max(f_{i-1,k}+m_j,f_{i,j})

其中 kk 满足存在 kjk\rightarrow j 的边。

细节#

  • 初始化时,f0,1=0f_0,1=0。所有的节点都要初始化为 1-1,表示在第 ii 天时不可能在城市 jj
  • ii 的最大值可以直接设为 10001000,因为在最极限的情况下,i=1000i=1000 也会使得 max(mi)×ii2×C0\max(m_i)\times i-i^2\times C\le 0

P8186 [USACO22FEB] Redistributing Gifts S#

题目链接

Description#

给定 NN 个礼物和 NN 头奶牛,对于每头奶牛而言,它会有一个愿望单排列 wiw_i,表示它希望收到的礼物编号。奶牛喜欢获得出现在愿望单中更早的礼物。

最初第 ii 号礼物对应第 ii 头奶牛,请重新分配礼物,使得每头奶牛都可以获得跟原来一样或者更好的礼物。

Solution#

先考虑什么情况下奶牛可以获得更优的礼物。对于奶牛 ii,假设其可以获得的更优的礼物编号是 jj,那么奶牛 jj 由于没有了礼物需要换为一个更优的礼物 kk。以此类推,只有当某一头奶牛的更优礼物是编号 ii 时,所有路径上的奶牛才能获得更优的礼物。

不难发现,此时会形成一个环。那么我们只需要使用Floyd判环即可。

Floyd判环#

Floyd 算法通过不断枚举中间点,来更新所有点对之间的最短路径。

具体过程类似DP,设 fi,jf_{i,j} 表示从 iijj 的最短路径长度。那么转移方程就是:

fi,j=min(fi,j,fi,k+fk,j)f_{i,j}=\min(f_{i,j},f_{i,k}+f_{k,j})

其中 kk 是枚举的中间点。

同理,我们可以使用Floyd判环来判断是否存在环。我们可以把 fi,jf_{i,j} 看作从 iijj 之间是否存在路径。那么转移方程就是:

fi,j=fi,j(fi,kfk,j)f_{i,j}=f_{i,j}\lor(f_{i,k}\land f_{k,j})

其中 kk 是枚举的中间点。

如果在枚举完所有中间点后,fi,if_{i,i}11,那么就说明存在环。

P7149 [USACO20DEC] Rectangular Pasture S#

题目链接

Description#

在一个二维方阵中,有 nn 个点,每个点有一个坐标 (xi,yi)(x_i,y_i)

可以选择一个矩形,请求出可以包围在这个矩形之中的不同的点子集的数量。空集也算作一种答案。

Solution#

首先,题目的坐标范围都是 10910^9,且根据题目,每行每列最多只会有一个点。那么我们可以通过离散化,把方阵缩小到一个 n×nn\times n 的方阵,每个点分别对应 i,pii,p_i

由于相同的点集算作一种答案,那么只需要枚举最小矩形即可。

那么我们可以枚举矩形的上下边界 i,ji,j,设上下对应的左右边界 l=min(pi,pj),r=max(pi,pj)l=\min(p_i,p_j),r=\max(p_i,p_j)

显然,对于 iijj 之间的所有点,如果横坐标在 [l,r][l,r] 之间,那么这个点就会被包含在矩形之中,无法额外产生贡献。

所以只需要统计矩形左边和右边的点的数量,然后通过乘法定理来统计答案即可。

统计矩形左边和右边的点的数量可以在离散化之后,使用二维前缀和或者树状数组来统计。

注意空集也算一种答案,所以最终的答案数要加上 11

思维题单刷题记录
https://blog.introl.top/posts/思维题刷题记录/思维题单刷题记录/
作者
Introl
发布于
2025-11-12
许可协议
CC BY-NC-SA 4.0