题目
思路
大佬的博客写的贼好,我都不好意思自己再写一篇了 😇
其实我们可以认为能力值互不相同,哈希一下即可。
首先,第一步就直接是神来之笔,将过程转化为树!一颗完全三叉树,每个非叶子节点代表,三个儿子中 “脱(吃)颖(了)而(狗)出(粮)” 的那个可怜人。叶子节点则是全体贵族。
这棵树可能就是介个样子的,拿样例解释中的队伍来画一画:
当然,树的形态可能会长的奇奇怪怪。但是,我肯定地说,树的形态是唯一的!
现在,我们有一颗树,其中的一些节点是被固定了的。我们就可以利用树形 d p dp dp 啦!
第二步,又是天启之着,二分最终的答案,将数字划分为零和一!
这个操作也可以在这道题里使用。特点:只在乎大小关系。
划分成零和一之后,我们可以直接用树形 d p dp dp ,记 f ( x ) f(x) f(x) 为,使得 x x x 为 1 1 1 的代价。叶子节点很简单,直接判断是否为 1 1 1 ;否则,我们需要两个儿子都取到 1 1 1 。所以,简单来讲就是 f ( x ) = min cyc [ f ( a ) + f ( b ) ] f(x)=\min_{\text{cyc}}[f(a)+f(b)] f(x)=cycmin[f(a)+f(b)]
这里借用了一下循环求和的符号 cyc \text{cyc} cyc ,意会就好啦,就是选两个子节点。
显然 d p dp dp 的复杂度是线性的,又有二分,故总复杂度是 O ( n log n ) \mathcal O(n\log n) O(nlogn) 。
代码
该博主设置了查阅权限,只有他的女朋友才能查看代码!
——不过他没有女朋友。