题解:[JAG 2024 Summer Camp #3] Draw the Tree
首先是结论:将树上的点 \(0/1\) 染色,如果每个点相邻的同色点不超过 \(2\) 个且删去这个点后同时包含 \(0/1\) 两种颜色的连通块不超过两个,等价于存在一种将所有 \(0\) 点放在第 \(0\) 行,所有 \(1\) 点放在第 \(1\) 行,且 \(m=\max(cnt_0,cnt_1)\) 的画树方案。
首先说明如果 \(m\) 可以随意取存在画树方案,那么 \(m=\max(cnt_0,cnt_1)\) 也存在。考虑一条线段什么时候会与其他线段相交。假如这条线段连接第 \(0\) 行的两个点 \((i,0),(j,0)(i<j)\),那么只有 \(([i+1,j-1],0)\) 中存在另一个点时会相交,第 \(1\) 行同理。如果这条线段连接 \((i,0),(j,1)\),那么会和连接 \((a,0),(b,1)\) 且满足 \(a<i,b>j\) 的线段相交。由此可以看出,假如某种合法画树方案中第一排的点依次位于 \((i_0,0),(i_1,0),\dots,(i_k,0)(i_0<i_1<\dots<i_k)\),那么可以进行“离散化”,也就是将位于 \((i_j,0)\) 的点改到 \((j,0)\),使得所有线段仍然不交。第二行同理。
接下来只要证明上面的条件等价于存在一种不限制 \(m\) 的画树方案。条件的必要性不难看出,下面证明充分性。
考虑一棵满足条件的树中一个点周围的其他点,不妨设这个点为 \(x\),染色为 \(0\)。将其删掉后:
-
最多出现两个全为 \(0\) 的连通块,并且每个连通块一定是一条链,且链的一端原来与 \(x\) 有连边。假如最后 \(x\) 放在 \((p,0)\),那么只需要将这两个连通块分别放在 \((p-1,0),(p-2,0),\dots\) 和 \((p+1,0),(p+2,0),\dots\) 即可,根据上面线段相交的条件容易发现这样不会导致线段相交,所以可以将这两个连通块从原树中删去同时不影响画树方案存在性。
-
可能出现任意多个全为 \(1\) 的连通块,并且每个连通块一定是一条链,链上任意一点原来与 \(x\) 有连边。假如最后 \(x\) 放在 \((p,0)\),那么只需要将这些连通块放在 \(([p,p+len_1-1],1),([p+len1,p+len_1+len2-1],1),\dots\) 和 \((p+1,0),(p+2,0),\dots\) 这些连续的区间即可。同上可以将这两个连通块从原树中删去同时不影响画树方案存在性。
-
将上面的操作做完后,这棵树会被删成一条链。设链上从左往右第 \(i\) 个点为 \(x_i\),颜色为 \(c_i\),只需要将 \(x_i\) 放在 \((i\times n,c_i)\) 以留下空间容纳它周围的同色连通块即可。
这样就构造出了一种画树方案,进而存在一种 \(m=\max(cnt_0,cnt_1)\) 的画树方案。
考虑对上面的东西进行 dp。由于外子树限制比较麻烦,考虑选取一个特殊的点作为根,使得对于不为根的点 \(x\),一定有 \(x\) 的外子树(即全树删去 \(x\) 的子树后剩下的部分)至少有两种颜色。
- 若存在一个点度数不小于 \(4\),选它为根即可。
- 若存在两个点 \(u,v\) 度数等于 \(3\) 且不相邻,取 \((u,v)\) 路径上任意一点(不是 \(u,v\))作为根即可。
- 否则若存在只两个度数为 \(3\) 的点 \(u,v\) 且相邻,不难发现此时答案一定可以取到 \(\lceil\frac{n}{2}\rceil\)。
- 否则若存在不超过一个度数为 \(3\) 的点,不难发现此时答案也一定可以取到 \(\lceil\frac{n}{2}\rceil\)。
然后可以设 \(f_{x,o,c}\) 表示考虑 \(x\) 子树内,\(o=0/1\) 表示 \(x\) 和 \(fa_x\) 颜色是否相同,\(x\) 子树中有 \(c\) 个点和 \(x\) 颜色相同,是否存在合法染色方案。合并子树时记 \(g_{a,b,c}\) 表示已经合并的子树中有 \(a\) 个包含两种颜色,\(b\) 个根和 \(x\) 同色,和 \(x\) 同色的点共有 \(c\) 个,限制即为 \(b+o\le 2\),对于非根节点 \(a\le 1\),对于根节点 \(a\le 2\)。
写出转移可以发现是树形背包的形式,复杂度 \(\mathcal O(n^2)\)。
dp 值只有 \(0/1\),考虑 bitset 优化。使用 vector 实现 bitset,下面认为 \(f_x\) 的长度是 \(\mathcal O(siz_x)\)。对于求 \(f_x\),先把重儿子的 \(f_{hson_x}\) 继承,这部分可以通过平移和翻转做到 \(\mathcal O(\frac{siz_x}{w})\)。然后对于每个轻儿子 \(y\),暴力枚举 \(f_y\) 中值为 \(1\) 的部分,然后对 \(g\) 的操作只有平移和取或,这部分复杂度是 \(\mathcal O(siz_y+\frac{siz_x\times siz_y}{w})\)。注意到:
后面两部分实际上都是经典的树形背包的复杂度,故总复杂度为 \(\mathcal O(n\log n+\frac{n^2}{w})\)。
在根旁边额外连一个与根颜色不同的点显然不改变合法性,所以答案为 \(\displaystyle\min_{f_{rt,1,i}=1}\{\max(i,n-i)\}\)。

浙公网安备 33010602011771号