[JOI 2015 Final]舞会

220 篇文章 2 订阅
98 篇文章 0 订阅

题目

传送门 to LOJ

思路

大佬的博客写的贼好,我都不好意思自己再写一篇了 😇

其实我们可以认为能力值互不相同,哈希一下即可。

首先,第一步就直接是神来之笔,将过程转化为树!一颗完全三叉树,每个非叶子节点代表,三个儿子中 “脱(吃)颖(了)而(狗)出(粮)” 的那个可怜人。叶子节点则是全体贵族。

这棵树可能就是介个样子的,拿样例解释中的队伍来画一画:

在这里插入图片描述当然,树的形态可能会长的奇奇怪怪。但是,我肯定地说,树的形态是唯一的

现在,我们有一颗树,其中的一些节点是被固定了的。我们就可以利用树形 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)

代码

该博主设置了查阅权限,只有他的女朋友才能查看代码!

——不过他没有女朋友。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值