Loading [MathJax]/jax/output/HTML-CSS/fonts/TeX/fontdata.js
Alpha1022's Diaries
那儿,矛盾对立寂灭之处,即是涅槃。
挚爱的渴望之星,依然向我灼灼燃烧。
双极定向学习笔记
  1. 「CF730K」Roads Orientation Problem
  2. 「CodeChef CUREK」Curing Kingdom
  3. 「CF1916F」Group Division
  4. 「IOI2019」景点划分
  5. 「QOJ 4805」Grammy Sorting
  6. 「QOJ 8477」Twinning Totem
  7. 「洛谷 P9394」白鹭兰

「CF730K」Roads Orientation Problem

板子题。

「CodeChef CUREK」Curing Kingdom

考虑所有内部只有一个割点的点双,显然所有这样的点双中只能有最多一个点双初始时没有发到特效药。同时,每个有特效药的点双只需要发一个点就能解决问题。

将没有特效药的那个叶子点双提到根,现在每个叶子都恰好有一个点有特效药,我们只需要将这些叶子的虚树每条边做双极定向即可构造。

写得比较聪明的话大概可以统一成一个过程。

「CF1916F」Group Division

注意到双极定向的拓扑序满足任意前缀和任意后缀均连通。

「IOI2019」景点划分

不妨设 abc,我们只需要构造 A,B 分别是连通块,因此这是上一题的加强版。

注意到最多存在一个点双 D 同时与 A,B 相交,因此不妨枚举一个 D,将其提到圆方树的根。

如果 D 最大的子树大小超过了 b+c,则其他子树不可能找出 A

否则,如果 D 最大的子树大小不小于 b,则容易取出 A,B

否则,考虑取出 D 内的任意一个双极定向拓扑序,则其第一个子树总大小不小于 a 的前缀一定满足子树总大小小于 a+b,于是后缀大小不小于 c,因此不小于 b。于是也可以取出。

「QOJ 4805」Grammy Sorting

这位更是二合一。

最终的答案显然给出一组 (A,B) 的双极定向,我们只需要先构造一组答案再构造一组操作方案。

构造操作方案是 APC001H。

做法是每一轮 O(n) 解决所有子树内只有一个叶子的点,在每条链维护一个有序的后缀,然后每次如果根结点处的权值属于本轮需要归位的,就移动到对应的后缀,这部分的操作次数不超过需要归位的点数;否则,我们考虑一直把最深的未归位权值往上移动一位,同时会让其祖先的所有未归位权值上移一位,因此这部分的操作次数不超过当前点数。进一步,注意到每一轮至少会使得叶子个数减半,所以总操作次数不超过 n(log2n+1)

「QOJ 8477」Twinning Totem

容易注意到需要 u 是唯一的割点,或者整个图是一个点双。前者容易拆分成后者。

对于一个点双,我们考虑复制一个 u 作为 u,那么显然我们存在 (u,u) 的双极定向。考虑分别取正图和反图的一棵外向生成树即可。

「洛谷 P9394」白鹭兰

k=1 的构造就是双极定向。条件就是点双是一条链。

不妨钦定第一个和最后一个涂黑的点 s,t。考虑 s,t 路径上的方点 u,其不在路径上的子树各自都需要一次删空;考虑路径上的圆点 v,其与其不在路径上的子树的并也需要一次删空。因此它们构成了 k 的下确界。我们需要找到一对 s,t 使得这个下界最小。

s,t 的 LCA 为 anc 且分别位于 anc 的儿子 s0,t0 的子树中,则从 s0st0t 一直选择最大的子树一定是不劣的。类似,s0,t0 取最大和次大的子树也是不劣的。

对于构造答案,我们保留 s,t 路径上的点,以及路径上的方点邻接的圆点,构造双极定向的拓扑序即可。然后将旁边的点加入对应的圆点即可。