[NowCoder5674B]Groundhog and Apple Tree
/ / 阅读耗时 7 分钟Solution
题面略,话说很久都没有因为一道题而单独开一篇文章了。
在某一个节点休息(恢复HP),可以认为是它在父节点休息够了再下来,这样所有的休息操作都可以放到根节点上。
设置一个$dp(x)$,表示到$x$子树上,至少需要多少的HP才能完整地遍历这棵树,答案就是$dp(1)$。
注意到若按照最优决策进行,假设从某一个节点开始时HP是$x$,返回回来时是$y$,则$x-y$应是一个定值,设其为$c_i$,$c_i$可以通过下面的递推式计算得到:
其中$son(i)$是$i$的子节点集合,$e(i,j)$是$(i,j)$边的边权,$a_i$是$i$上苹果的值。
然后考虑如何进行$dp$的递推,主要是子节点访问顺序的问题,假设我们按照$s_1,\cdots,s_k$的顺序进行,其中$k=|son(i)|$。
为了简化这个问题,我们先忽略$i$处的苹果,最后把它单独减去即可,然后定义一个函数$f_i$表示已经遍历了前$i-1$棵子树回到根节点$i$时的HP,这样由如下的递推关系(下面把$e(i,son_j)$简写成$e(j)$):
假设$f_1=x$,则简化这个式子后可以得到:
综合来看,就有:
这里认为$e_{k+1}+dp(k+1)=0$,于是$x$就应该为右侧的最大值,容易发现$dp(i)=\max(0,x-a_i)$。
根据贪心相邻最优的观点,假设有$i$和$j$相邻,并假设之前的前缀和是$S$,那么不交换的两者较大值为:
交换后就是:
假设交换后更优,则有两种情况,第一种情况:
它等价于:
另一种情况:
它等价于:
下面证明几个观点:
若$2e_i+c_i>0$,而$2e_j+c_j<0$($j=i+1$),则两者必交换。即满足$2e_j+c_j<0$者顺序靠前。
首先,若$e_i+dp(i)>e_j+dp(j)$成立,则满足第一种情况,交换两者更优。
若$e_i+dp(i)<e_j+dp(j)$,则有:
三个式子叠加得到$dp(j)-e_j-c_j>dp(i)-e_i-c_i$,满足条件二,因此两者交换更优。
对于$2e_j+c_j<0$,$e_j+dp(j)$较小者靠前。
这由条件一直接可以得到。
对于$2e_j+c_j>0$,$dp(j)-e_j-c_j$较大者靠前。
这由条件二直接可以得到。
综上我们得到了一个贪心算法,可以发现这个相邻最优的排序是可传递的,这保证了它的正确性。贪心的准则如下:
- $2e_j+c_j<0$靠前,$2e_j+c_j>0$靠后。
- 对于$2e_j+c_j<0$,$e_i+dp(i)$较小者靠前。
- 对于$2e_j+c_j>0$,$dp(j)-e_j-c_j$较大者靠前。
1 |
|