2025 山东省队集训 D1T2 礎石花冠
题目大意:
给定 \(n, m\) 还有两个长度为 \(n\) 的序列 \(A,B\)。
保证 \(A,B\) 互不相同。
设 \(i < j\)。
若 \(a_{i} < b_{j}\) 则连一条 \(i \to j\) 的边。
若 \(a_{i} > b_{j}\) 连一条 \(j \to i\) 的边。
所以这是一个竞赛图。
现在你要删掉其中的 \(m\) 条给定的边。
设 \(f(G)\) 表示与 \(G\) 的传递闭包相同的图中边数最小的图。
请输出 \(f(G)\),输出任意一组解即可,保证 \(f(G)\) 的边数 \(\le 4 \times 10^5\)。
\(n,m \le 10^5\)
解题思路:
首先环是简单的,但至少要 \(n\) 条边,且这是简单的。
但 \(O(n^2-m)\) 条边,直接去暴力求 \(scc\) 是不行的,考虑优化。
由于边只与 \(a,b\) 大小有关,所以我们可以拿线段树去维护 \(a/b\) 的 \(min/max\)。
找一个区间中有没有连边可以线段树二分。
然后由于有 \(O(m)\) 条边不能存在,所以可以枚举 \(x\) 的出边时可以用这连出去的不能选的边分为 \(O(m)\) 段。
这里得用 \(Kosaraju\) 算法求 \(scc\),因为我们需要他的拓扑序。
那么现在从一个竞赛图变成了一个 DAG,且我们有他的拓扑序,且这个拓扑序一定是 \(1,2, \sim tot\)。
考虑倒着枚举拓扑序,我们只需要保证对于每个 \(i\) 能到达它所能到达的点即可。
因为这是满足局部最优性的。
考虑若 \(x \to y\),\(i \to x\),\(i \to y\),那么显然最后这条边是可以不连的。
那么启发我们递归上去,可以记录所有入度为 0 的点。
不妨先将缩完点之后的不存在的出点按照标号从小到大排序。
存在的边太多了,且不好算,所以考虑枚举每一条不存在的边。
- 若指向的点入读为 \(0\),那么说明 \(i\) 永远不可能到这个点,将他临时删去,如果他指向的点现在度数为 0,那么将他指向的点加进入读为 0 里。
- 若指向的点的入读不为 \(0\),那么说明:能到达它的点已经可以被 \(i\) 到达了。
然后将最后的所有入读为 0 的点给连一条边。
考虑这样正确性肯定有的,那么时间复杂度呢?
\(O(m \sqrt m)\) 的。
因为你考虑在任意时刻,入度为 0 的集合都要保证两两无边。
所以最多是 \(O(\sqrt m)\) 级别。
于是每个点最多连出去 \(O(\sqrt m)\) 级别的边。
那么第一种情况每次最多加 \(O(\sqrt m)\) 级别的点。
所以时间复杂度为 \(O(m \sqrt m)\)。
所以他保证答案边数不超过 \(4 \times 10^5\) 是仅仅为了输出呗?
没想到的点:
感觉做这种省选级别以上的题目就是对思维要求挺高的。
以后见到有向图先看一下能不能拆成环与DAG。
DAG从后往前考虑拓扑序一般是有局部最优性的。

浙公网安备 33010602011771号