传送门:bzoj4446
题解
倍增+DP好题。这道题的DP太神了!
感觉上这道题怎么DP向后的状态,或向前的状态都非常不好做,从Chen’s Blog学到了DP的新姿势
非常关键的一点:这是一颗完全二叉树。很多DP的优化方法都由此而来。
观察点灯的过程:
(1) 点亮一个点
(2) 选择其一个子节点递归下去,递归完毕则该子节点子树全部点亮(最后一个被点亮的必然是某个该子树内的叶子节点)
(3) 再递归另一子树
(4) 该子树已全部点亮,回溯其父节点
(5) 继续操作,直到整棵树都被点亮
由此过程受到启发:
- 无法有效枚举每一点是由其兄弟节点子树内哪个叶子转移而来
- 但可以枚举叶子转移到其某一级祖先的兄弟节点/或某一级祖先(注意这是一颗完全二叉树,层数是严格 logn log n 的)的最少花费。
- 转移到某一级祖先的兄弟节点的情况表示过程(3),转移到某一级祖先的情况表示过程(4)
现在可以列出转移数组 f[i][j][0/1] f [ i ] [ j ] [ 0 / 1 ] 了,设 lci,rci l c i , r c i 分别表示节点 i i 的左右儿子,节点 的第 j j 个祖先为 (这里的第 j j 个祖先表示第 靠近该点的祖先),节点 i i 的第 个祖先的不为 i i 祖先的子节点( 的兄弟)为 li[i][j] l i [ i ] [ j ] 。
f[i][j][0] f [ i ] [ j ] [ 0 ] 表示以节点 i