Codeforces Round 1001,Div. 1 + Div. 2记录
挑战极限一天打三场比赛失败,困得要死。
好的,现在心情好一点了,主播要上播了。
D
你说得对,但为什么我的树形dp式子那么复杂?
考虑如果要调整\(a_u\)与\(a_{fa_u}\)相等,仅仅是操作\((u,fa_u)\)或\((fa_u,u)\)有意义(保证不影响其他节点的差)
所以对于每个\((u,fa_u)\),至少需要调整\(|a_u-a_{fa_u}|\)次。
剩下的就是简单dp了,不说了。
E1
考虑肯定要找到一个子树,删除根\(u\)后剩下的大于\(a_u\)的值存在。
考虑怎么选是最优的,对于当前选择的\(w\),若\(u,v,w\)分居子树并且\(a_u>a_v>a_w\),那么选择\(v\)一定更优。
意思就是,我们要选择符合条件的子树时,同时保证\(a_u\)最大。
F
这个max看起来不是很好做,我们考虑把它拆开。
令\(x_i=\frac{a_i+b_i}{2},y_i=\frac{a_i-b_i}{2}\)
则\(\max(a_i+b_j,a_j+b_i)=\max(x_i+y_i+x_j-y_j,x_i-y_i+x_j+y_j)=x_i+x_j+|y_i-y_j|\)
当端点及要选的点集确认后,整条路径的最小值可以直接求出,为什么?
\(x\)会在两个端点分别被计数一次,在非端点计数两次。而对于\(y\)来说,一定是\(y\)较小的端点开始递减,连到最小值之后再移动到最大值,最后再移动到\(y\)较大的端点。

这个策略显然是最优的。
那么问题就简单了起来,设计\(dp_{i,j,0/1/2}\)为当前选了\(i\)个点,最后一个点为\(j\),已钦定端点个数为0/1/2的最小代价。实际实现时需要一个前缀取min。

浙公网安备 33010602011771号