题解 P6748 【『MdOI R3』Fallen Lord】
update(20/8/18):感谢@loveJYdalao指出错误。
算法标签:
这题其实很好写,就是dp状态不太好想。
前置芝士:一个数列的中位数小于等于
记
首先,显然没有无解的情况,因为如果每条边权都置为
然后,由于以上性质我们发现对于一条边的边权 我们只关心其是否大于两端点点权,于是
设
当
设
当
举个例子:
以点5 为例,其周围有3 条边,则应存在2 条边边权小于等于40 。当边(2,5) 边权小于等于40 时,向下可以有一条边权大于40 ,所以f_{5,0}=30+50 。
显然,如果我们以点
接下来是状态转移。
- 已经算出
\forall v\in \operatorname{son}(u)\ \ \ \ g_{v,0/1} ,求f_{u,0/1} :
考虑贪心。我们先选所有g_{v,0} ,即使所有到儿子的边的边权都小于点u 点权。对于f_{u,0} ,此时可以有\operatorname{du}(u)-\left(\left\lfloor\dfrac{\operatorname{du}(u)}{2}\right\rfloor+1\right) 条边的边权大于点u 点权;对于f_{u,1} ,此时可以有\operatorname{du}(u)-\left(\left\lfloor\dfrac{\operatorname{du}(u)}{2}\right\rfloor+1\right)-1 条边的边权大于点u 点权。设允许的边权大于a_u 的边数为k ,我们从大到小枚举k 个g_{v,1}-g_{v,0} ,即贪心地考虑将小于a_u 的边换成大于a_u 的边即可。 - 已经算出
f_{u,0/1} ,求g_{u,0/1} :
分类讨论:-
a_u<a_{\operatorname{fa}(u)} -
g_{u,0} -
a_u<\operatorname{val}(\operatorname{fa}(u),u)\leq a_{\operatorname{fa}(u)} -
\operatorname{val}(\operatorname{fa}(u),u)\leq a_u<a_{\operatorname{fa}(u)}
-
-
g_{u,1} -
a_u<a_{\operatorname{fa}(u)}<\operatorname{val}(\operatorname{fa}(u),u)\leq m
-
-
-
a_u=a_{\operatorname{fa}(u)} 直接并入1或3
-
a_u>a_{\operatorname{fa}(u)} -
g_{u,0} -
\operatorname{val}(\operatorname{fa}(u),u)\leq a_{\operatorname{fa}(u)} <a_u
-
-
g_{u,1} -
a_{\operatorname{fa}(u)}<\operatorname{val}(\operatorname{fa}(u),u)\leq a_u -
a_{\operatorname{fa}(u)}<a_u<\operatorname{val}(\operatorname{fa}(u),u)\leq m
-
-
-
综上:
然后从下向上dp即可。
注意到当
AC代码