Loading

集训队互测2023 通道建设

本题可以在 \(O(n\log n)\) 的询问集合大小总和的复杂度内直接求出树的形态,无需利用题目一开始给出的 \(n-1\) 条虚树上的边。

由于返回的只有 \(\text{bool}\),使用传统的树剖增量法与随机点分治由于没法快速求出一个点的出边不易于维护(当然其实可以花费更大的代价,但是只能 \(O(n\log^2 n)\))。考虑类似 \(\text{2022}\) 年互测树那题的技巧,先将每个点的深度求出来,每次将深度为 \(d-1\) 的点集 \(S_{1}\) 与深度为 \(d\) 的点集 \(S_{2}\) 之间连边,一个非常 \(\text{trival}\) 的想法是每次将 \(S_{1}\) 分成两个集合 \(T_{1},T_{2}\),求出 \(T_{1}\) 中所有点的 \(\text{lca}\) \(l\),询问 \(query(S_{2},T_{1},l)\),通过该信息确定 \(S_{2}\) 哪些的父亲为 \(T_{1}\),哪些为 \(T_{2}\),递归去做。

但是实际上这是错误的,以在 \(T_{1}\) 子树外的点为根,\(S_{1}\)\(\text{lca}\) 并不总是 \(l\),还可能为其他值,想一想可以发现如果令 \(T_{1}\) 的点为黑色的,\(T_{2}\) 的点为白色的。这种情况只会发生在 \(\text{lca}\) 的子结点中有黑白相间的子树时,因为这时在询问该子树内的白时可能将其判为其与该子树黑的 \(\text{lca}\),而当 \(l\) 的子树中只有全黑全白子树时这种情况不会发生。

现在的问题是我们要找到一个点集 \(T_{1}\),满足 \(|T_{1}|>1\)\(\max(|T_{1}|,|S_{1}|-|T_{1}|)\) 尽量小,考虑 \(\max(|T_{1}|,|S_{1}|-|T_{1}|)\) 可以达到的界:找到原树深度最大的带权重心(以 \(S_{1}\) 为权),则其子树内的 \(S_{1}\) 中点的个数 \(\geqslant \frac{|S_{1}|}{2}\),其儿子节点的 \(S_{1}\) 中点的个数 \(<\frac{|S_{1}|}{2}\),那么不难说明顺次加入所有子树,至少存在一个时刻满足 \(\max(|T_{1}|,|S_{1}|-|T_{1}|)\leqslant \frac{3|S_{1}|}{4}\)。注意当 \(|S_{1}|=2\) 时找不到合法的 \(T_{1}\),此时直接令 \(T_{1}=S_{1}\),问 \(lca\) 是否为 \(S_{1}\) 即可判断是两个中的哪一个。

于是每一次我们至少可以将一个大小为 \(n\) 的问题变为一个大小为 \(\frac{3}{4}n\) 的问题和一个大小为 \(\frac{1}{4}n\) 的问题,即可做到 \(C_{1},C_{2}\) 次数 \(2n\) 以内,\(Sum_{1}\) \(4n\log n\) 以内,\(Sum_{2}\) \(n\log n\) 以内,但实际上难以卡满。经测试表明 \(Sum_{1}\) 可能是 \(2n\log n\) 以内的,\(Sum_{1}\)\(90000\) 以内,\(Sum_{2}\)\(45000\) 以内。

最后构造匹配十分平凡,构造 \(dis\leqslant 2\) 的匹配即可。

posted @ 2024-03-28 10:33  zhouhuanyi  阅读(72)  评论(0编辑  收藏  举报