GDOI2025 简要题解
D1T2
首先题目对根号相关的提示已经非常到位了,而我们需要维护 DAG 上的信息而非序列,所以可以尝试操作分块。
考虑 \(B_1\) 个操作为一组,定义关键点为该组中修改过 \(a\) 或 \(b\) 值的点,则关键点数目为 \(\mathcal O(B_1)\)。
对于一个询问,可以暴力做关键点的贡献,\(\mathcal O(\frac {n^2} \omega)\) 预处理可达性可以每次 \(\mathcal O(1)\) 询问,这部分时间复杂度为 \(\mathcal O(B_1q)\)。
非关键点的信息可以视为常量,只需要静态处理 \(l, r\) 区间相关限制即可。为了能在 DAG 上良好合并信息,考虑值域分块,块长为 \(B_2\),每个点求出每个块中的最大权值。
单次查询时间复杂度为 \(\mathcal O(\frac n {B_2} + B_2)\),一共为 \(\mathcal O(q(\frac n {B_2} + B_2))\),每一组操作分块的处理为 \(\mathcal O(\frac {n^2} B_2)\)。
视 \(n, q\) 同级,平衡一下,取 \(B_1 = B_2 = n^{\frac 23}\),总时间复杂度为 \(\mathcal O(n^{\frac 53})\)。
D1T3
把点放在一个圆上,条件相当于每条边不相交。易知 \(p_1 = 1\),所以对于一棵树,只需要满足其每个点的子树代表的编号为一个连续段即可,这可以贪心合并。
对于多棵树的答案合并,不难发现任意两棵树的序列之间要么包含,要么不交。所以可以按照最小点编号从小到大依次插入。
对于一张图,容易发现任意两个点双是独立的,所以可以建立圆方树。
我们可以证明一个点双一定是形如一个大环外加若干条不相交的边,考虑放在圆上结合耳分解使用归纳法可证。
所以只需要满足这个大环上的点的重新编号递增即可,找大环可以利用广义串并联图的方法:缩二度点,去重边。
重新回到圆方树上。对于一个方点我们需要找到对应的大环,对于一个圆点我们仍然贪心合并其所有儿子。可以证明,以 \(1\) 为根时,一个圆点不可能夹在其儿子对应点双之间。
时间复杂度 \(\mathcal O(n)\) 或 \(\mathcal O(n\log n)\)。
D2T2
C 性质可以看主旋律的做法。如果要求是最小外向生成树,需要按照边权从小到大一层一层加边,并合并连通块。定义一个连通块的根集为可以作为根的点集。合并若干个连通块时,新加的边中只有指向原来的根集的边才有意义,其他边可以不管。设 \(res_S\) 表示对于当前连通块,\(S\) 中的点作为根集的答案,\(res_S\) 有意义当且仅当 \(S\) 连通。
我们思考新的根集:设新的零入度 SCC 中包含的原连通块分别为 \(i_1, i_2, \dots, i_k\),则新的大连通块的根集为 \(R' = R_{i_1} \cup R_{i_2} \cup \dots \cup R_{i_k}\)。
尝试直接暴力 DP 这些信息。设一个点集 \(S\),定义 \(l(S)\) 表示 \(S\) 中的点涉及的连通块集合,定义 \(r(S)\) 表示 \(l(S)\) 中的连通块的点的并集。
仿照 C 性质的做法,我们仍然定义 \(h_S\) 表示若干个零入度 SCC 并起来的总贡献。由于需要满足每个原来的连通块在合并后仍然弱连通,所以每次从 \(S\) 中拆除一个子集 \(T\) 时需满足 \(l(T) \cap l(S \backslash T) = \varnothing\)。更深入的,我们可以视 \(S\) 为这些点涉及的连通块的并集 \(r(S)\),只不过 \(S\) 是他们的根集的并集而已,注意若涉及某个连通块则 \(S\) 一定包含其内部的一个点。
接下来说说系数,我们只看那些指向根集中的点的边。从 \(h_{S\backslash T}\) 到 \(h_S\) 的转移中,只有 \(r(S \backslash T)\) 连向 \(T\) 以及 \(r(T)\) 连向 \(S \backslash T\) 的边才有 \(\frac 12\) 的贡献,这个容易计算。
然后是 \(f_S\),枚举 \(T\) 表示从 \(h_T\) 转移到 \(f_S\),系数同 \(h_S\) 的计算。但是 \(l(T)\) 不一定与 \(l(S)\) 相等,即可能还漏了一些连通块,这时候乘上若干 \(res\) 的值即可。通过去 lowbit 承接的方式可以避免直接枚举需要乘的 \(res\),使复杂度 \(\mathcal O(3^nn)\) 降到 \(\mathcal O(3^n)\)。
然后计算 \(res_S\) 也比较类似,单次时间复杂度为 \(\mathcal O(2^nn^2 + 3^n)\)。由 \(2^0 + 2^1 + 2^2 + \dots + 2^n = 2^{n + 1} - 1\) 类似的结论可以推断总时间复杂度为 \(\mathcal O(2^nn^2 + 3^n)\)。

浙公网安备 33010602011771号