Loading

QOJ5015 树(二分,换根 DP,*)

QOJ5015 树

随机选根 \(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 最深的点集肯定会淘汰,然后剩下的有至少一半期望会淘汰。

posted @ 2023-02-09 10:41  Pizza1123  阅读(59)  评论(0)    收藏  举报