CF1379E - Inverse Genealogy
CF1379E - Inverse Genealogy
题目大意
给定 \(n,k\) ,要求构造一棵二叉树满足
1.除了叶子以外的节点有两个儿子
2.称一个节点是特殊的:两个儿子中,一个儿子 \(size\) 至少是另一个的两倍
要求特殊的节点恰好有 \(k\) 个
分析
首先考虑一些简单的情况
\(2|n\) 时不存在合法二叉树
\(n\) 个节点的树,能够包含 \(0\) 个特殊节点当且仅当 \(\exists 2^i-1=n\)
也就是能够构成一棵完美二叉树
3.除了 \(2\) 情况外的树,顺次放置每个节点得到的二叉树恰好包含1一个特殊点
那么当 \(k\leq 1\) 时的情况均可以被解决
否则,考虑通过加上一条极长的链来构造
即构造一个一边儿子大小为1,另一边顺次相接的链,这样能够做到最大利用点数
最多能得到 \(\frac{n-3}{2}\) 个特殊点
然而我们必须处理剩余点的分配,下面给出的构造能够解决 \(k\in [2,\frac{n-3}{2}]\) 的情况
通用构造
经过不断尝试得到的构造方法,好像很强
假设得到一条长度为 \(m\) 且右偏的上述链,将剩下的点分配到两个地方
1.根的左儿子
2.链底的右儿子
分配方式就是顺次放置每个节点得到的二叉树
设剩下节点个数+根的左儿+链底的右儿子 \(=c\)
设 \(f(n)=1-[\exists 2^i-1=n]\) ,特别的,当 \(2|n\) 时, \(f(n)=\infty\)
假设根的左儿子分配大小为 \(x\) ,则新的树特殊点数目就是
\(m-2+f(x)+f(c-x)+[c-x\ge 3]+[x\ge 2(n-1-x) \text{ or } (n-1-x)\ge 2x]\)
枚举每一个 \(x\in[1,c-1]\) ,判定上式是否成立即可
1 | const int N=1e5+10; |