loj6669 Nauuo and Binary Tree 题解
赛时做法
先 \(n-1\) 次问出深度
逐层考虑。slv(vector<int> a,vector<int> b)
表示在点集 \(a\) 中寻找 \(b\) 中点的父亲,询问 \(a[0]\) 和 \(b\) 中所有点的距离分治下去
复杂度不会算,印象中过了
树剖
类似「即时战略」的 LCT 做法
考虑挂叶子(深度从小到大),此时根链已经确定了。重链剖分,询问该点和重链底的距离即可确定从哪个点离开重链,而二叉树最多只有一个轻儿子
时间复杂度 \(O(n^2)\),交互次数 \(O(n\log n)\)
具体的,设 \(T(n)\) 表示在 \(n\) 个点的树中挂一个叶子的交互次数,有 \(T(1)=0,T(n)=T(\lfloor\frac{n-1}{2}\rfloor)+1\)。总交互次数为 \(2999+\sum_{i=1}^{2999}T(i)\)