[Ynoi2006] rldcot
我们先不考虑 \(dep\) 的问题,先来研究有多少种不同的 \(lca(i,j)\)。
考虑改询问为贡献,计算一个 \(l\) 可以成为哪些 \((i,j)\) 的 lca。这个东西可以写成若干个点对对吧,倘若我们忽略掉一共有 \(O(n^2)\) 个点对的事实的话,我们的问题就转化成了有若干个被染成某些颜色的区间,每次询问被某个区间完全包含的区间中有多少种颜色(与平面上若干染色点,询问方阵内颜色数一样)。这个可以扫描线。带上 \(dep\) 也只是颜色而已。
我们发现,互相包含的区间是无意义的,我们可以只保留较小的。进一步,对于一个 \(l\) 和它的子树内任一点 \(u\),只有 \(u\) 和前后与它编号差最小的点构成的点对有意义。可以证明,这样的点对只有 \(O(n\log n)\) 个。
至此,我们可以在 \(O(n\log^2n+q\log n)\) 时间内解决此问题。
upd on 2023.6.15:
对于这样一类二元组产生贡献,询问区间内贡献的问题,由于我们询问的是一个区间,对于贡献重复的“间距较远”的二元组,我们可以不加考虑。