7.10 CW 模拟赛 T2. tree
心态
策略: \(60 + 40\)
停滞: \(20\)
数据检验, 关键步记录, 简化表述
思路
考虑点对问题往往可以点分治
现在我们考虑所有经过点 \(r\) 的路径 \(u \to v\) 中, 有多少满足 \(val_v \geq val_u\) 的并对 \(v\) 更新答案
显然考虑值域数据结构维护所有 \(val_u = i\) 的点 \(u\) 中的最大深度, 然后在遍历当前子树的过程中, 用当前子树到其他子树的路径更新当前子树的答案
现在的问题是如何排除当前子树
显然可以顺着扫一遍所有子树再反着扫一遍, 这样就能考虑完整
这样是 \(\mathcal{O} (n \log^2 n)\) 的, 是否存在更好的做法呢?
看到这题不难想到离线值域来处理
但是我们不好处理加入一个点之后如何更新答案
于是找点神奇贪心
考虑每次维护当前已经加入的点的最大距离点对 \(\{A, B\}\) 以及新加入的点 \(C\)
那么 \(C\) 到已经加入的点的最大距离为 \(\max \Big(dis(C, A), dis(C, B)\Big)\)
并且新的最大距离点对会在 \(\{A, B\}, \{A, C\}, \{B, C\}\) 中产生
简单证明
关于「\(C\) 到已经加入的点的最大距离为 \(\max \Big(dis(C, A), dis(C, B)\Big)\)」
如果存在一个更远点 \(D\) 满足 \(dis(D, C) > \max \Big(dis(C, A), dis(C, B)\Big)\)
那么无论树的形态如何, 都可以找到一条一端为 \(D\) 的路径使得这条路径长度大于直径
同理也可以证明接下来的那一点
于是就可以这样高效维护了
总结
值域数据结构可以高效离线统计 \(val \geq k\) 的信息
离线值域也不差