20221018题解


T1 road

思路分析

首先可以观察边权的表达式: \(c + \lfloor\frac{d}{t + 1}\rfloor\) 。

由于题目说了可以等待,我们可以发现如果等待 1 秒带来的收益(即 \(\lfloor\frac{d}{t + 1}\rfloor\) 的减少量)大于 1 ,那么一定要等;如果获得 1 的收益需要等待不止 1 秒,那么一定不需要等。尝试去掉下取整,用数学语言描述两个条件分别如下:

\[ \begin{gather*} \frac{d}{t + 1} - \frac{d}{t + 2} > 1 \\ \frac{d}{t + 1} - \frac{d}{t + 2} < 1 \end{gather*} \]

解得两个不等式的解如下:

\[ \begin{gather*} t < \frac{\sqrt{4d + 1} - 3}{2} \\ t > \frac{\sqrt{4d + 1} - 3}{2} \end{gather*} \]

当第一条成立的时候,立即就走,否则等到时刻 \(\lfloor\frac{\sqrt{4d + 1} - 3}{2}\rfloor + 1\) 再走。这样比标程常数小的多(标程尝试了 4 种边权)。

当然,你如果不放心,直接在 \(\sqrt d\) 附近多试几个数就好了。

剩下的就是堆优化 \(Dijkstra\) 。

AC 代码

T2

思路分析

对于边 \((u, v)\) , \(u, v\) 在同一个强连通分量的充要条件是 \(v\) 能到 \(u\) 。此时如果 \((u, v)\) 是 \(u\) 到 \(v\) 的必经边,那么翻转后强连通分量个数会变多。如果不是必经边,则强连通分量不会变。

而如果 \(v\) 本来就不能到 \(u\) ,那么翻转后 \(v\) 就能到 \(u\) 了。此时如果 \(u\) 还能到 \(v\) ,即 \((u, v)\) 不是必经边,那么强连通分量就变少了。如果 \((u, v)\) 是必经边,即翻转后 \(u\) 不能到 \(v\) 了,强连通分量不会变。

所以只需要考虑两个问题:

  1. 两点之间的可达性
  2. 一条边是否为必经边

第一个问题以每个点为起点搜一次就行了。时间复杂度 \(O(NM)\) 。

第二个问题看这张图:

由图上可以看出, \((1, 4)\) 并不是从 1 到 4 的必经边,因为从 1 到 4 有两种方法可达。在对从 1 开始的可达性搜索中,我们考虑在记录可达性的时候顺便记录是从 1 的哪一条出边开始搜的时候搜到的。那么,我们先按照某一个顺序选择 1 的出边,把数据记录在一个数组中。然后按照倒序再次进行搜索,记录在另一个数组中。因为 1 到 4 有不止一种方式可达,一个是 \(1 \rightarrow 4\) ,另一种是 \(1 \rightarrow 2 \rightarrow 3 \rightarrow 4\) ,那么 4 两次搜索记录的出边来源必然是不同的,一次记录了 \((1, 2)\) ,一次记录了 \((1, 4)\) 。反之如果 \(1\) 到 \(4\) 只有一种路径,那么两次搜索结果是一样的。这样就在 \(O(NM)\) 的时间解决了。

AC 代码