[poi2009]gas

(ps:某牛说是这题陈题= =我太孤陋寡闻了。。竟然都不知道是陈题。。。)

 

 

这题这个s的限制非常要命。

如果没有s会很好做。

先按照深度排序。

按顺序枚举

此时选择最远的点(k-th祖先)必然最优。因为按照深度排完序了,所以最远的点可以覆盖所有它子孙节点的。比较显然,

对于这个节点 选择可以覆盖到的s个最深的覆盖。。

 

 

一个节点可以选择一个建好的消防站或者离他最远的节点新建一个消防站

因为已经按照深度排完序了。所以那么一个已经建好的消防站覆盖的节点没有新的覆盖得多。所以我们就利用已经建好的消防站而不新建。

大多数人是直接选择s个最深的覆盖,- -表示我不知道该如何这样实现,感觉复杂度很大。

 

于是我想了一个办法。。每个节点找可以覆盖到他的最深的节点。其实本质是一样的。只是实现手段有差

 

实现上

给每个节点标记。
f[i,k]
表示该节点i可以拓展k的有多少个位置。。(没次新加一个消防站就给它和它的k个祖先都加上s)

 

然后枚举节点向上找k个祖先。。看看哪个最深的。然后从那个点出发删掉在上下长度共为k的链上各删去1.

(无论删哪条都可以(因为已经排好序了,不会影响结果,深的可以选择的,浅的选择更好)这点上我纠结了很久)

 

 

由于我的思维有限,虽然过了全部24个data,但是还是不太敢证明这样是对的。。

 

 

 

 

(变量名还是严谨点。。k不要做为主要变量。还有,我一开始的深度判断出问题了)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值