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 代码