题目
思考
我自己的想法是 d p ( u , 1 / 2 ) dp(u,1/2) dp(u,1/2) 表示在 u u u 的子树中,有 1 / 2 1/2 1/2 个子树的根和 u u u 颜色相同,从 u u u 开始单条路径的最小的最大颜色数。然后每个点统计答案在取最大。这其实是不对的,因为这样统计各子树的答案时,整棵树的结构是不确定的。所以我们希望能在 dp 的每一步确定最优的状态。
我们又发现 d p ( u , 2 ) dp(u,2) dp(u,2) 状态下的子树答案一定不大于 d p ( u , 1 ) dp(u,1) dp(u,1) 状态下的,而 d p ( u , 1 ) dp(u,1) dp(u,1) 可以减小全局的答案。因此,我们希望能有一个标准:如果 u u u 的子树中的答案较大那么就用 ( u , 2 ) (u,2) (u,2) 状态优化子树,如果子树中的答案较小,那么就用 ( u , 1 ) (u,1) (u,1) 优化全局。所以我们想到二分答案。
细节上,注意到 ( u , 1 ) (u,1) (u,1) 的优化效果很小( ≤ 1 \le1 ≤1),而 ( u , 2 ) (u,2) (u,2) 对子树优化很大,可能仍对全局更优,所以我们还是应当判断 d p ( u , 1 ) dp(u,1) dp(u,1) 和 d p ( u , 2 ) dp(u,2) dp(u,2)。
正解
首先二分答案。然后树 dp 得到 d p ( u ) dp(u) dp(u) 以及采取状态 1 / 2 1/2 1/2。过程中我们在子树的根上检查子树的合法性,以及判断采取策略。