[poi2009]gas

来源:互联网 发布:ubuntu 光盘安装软件 编辑:程序博客网 时间:2024/04/29 20:24

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

 

 

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

如果没有s会很好做。

先按照深度排序。

按顺序枚举

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

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

 

 

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

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

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

 

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

 

实现上

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

 

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

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

 

 

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

 

 

 

 

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

 

原创粉丝点击