QOJ5015 树(二分,换根 DP,*)
随机选根 \(r\),先问 \(n\) 遍问出每个点深度。一层一层做。如果求出下一层(设为深度 \(d\))的点 \(u\) 在前一层的父亲节点?
当前可能的父亲集合为 \(s\)。取出 \(s\) 的随机 \(\frac{|s|}{2}\) 个元素组成集合 \(h\),然后询问 \(u\) 到 \(h\) 的距离和 \(x\),令 \(X = x - |h|\)。
换根求出上一层每个点 \(v\) 到 \(h\) 的距离和 \(sum[v]\)。只保留距离和 \(= X\) 得到 \(s'\) 然后进行下一轮二分。
复杂度证明(设 \(cnt[v]\) 是 \(v\) 子树里的 \(h\) 点个数):
\[sum[v] = 2 |h| d - 2 \sum_{w \in anc(v) \land w \neq r} cnt[w]
\]
所以对于和 \(u\) LCA 最深的点集肯定会淘汰,然后剩下的有至少一半期望会淘汰。

浙公网安备 33010602011771号