如果存在 uu 不在 vv 的子树内且 wu>wvw_u>w_v,则最大的 vv 一定是可行的点。

此时,选择了这个点后,对方将无法选出一个点使得消除后剩下的点大于选择的点,因此可行。如果选择不出这样一个点,则无解。

首先想到枚举 vv,并要求在 O(logn)O(\log n) 时间内完成判断。看到这个时间复杂度以及最大值,我想到的是线段树(BIT 也可以的)。

为了实现查询,要想办法使得区间连续,为了实现这个目标,可以使用 DFS 序,令其为 dfndfn,这时查询的最大值可以分成 dfndfn 中的两段,前一段是 [1,dfnv][1,dfn_v],为了描述后一段,定义当前节点 vv 的子树中 dfndfn 最大的点的下一个点为 nxtvnxt_v,于是第二段为 [nxtv,n][nxt_v,n]nxtnxt 的求法可以在 DFS 中完成,详见代码。

提示:注意可能取到空区间,线段树中注意判断!

code