Luogu7126 [Ynoi2008] rdCcot
题意 : 给一棵 
每次查询给出区间 
对任意两个节点 
- 对任意 
, 
 - 对任意 
,  
定义“C-块”为一个点集 
- 对任意 
, 属于 的补集, 不 C-连通 
 - 对任意 
, 和 C-连通 
 - 对任意 
,有  
Part1
不难发现 C-块 点集是不交的,且任意两个 C-块 的虚树也是不交的。
考虑在每个 C-块 的最浅点将其统计,若同样浅,则选择编号较小的。(注意不是虚树的最浅点)
我们按照这个规则定义点的大小关系。
先考虑静态问题。给出一个点集 
每个点向距离 
正确性说明:相当于要证:从点
不断跳向距离 以内的最小点,最终可以来到所在 C-块 的最小点。 只有距离
以内没有更小的点才不能跳,因此上面的结论是显然的。 Part2
接下来考虑区间询问。
我们只需要快捷地判定某个点是否存在出边。
记距点 
对于点 
考虑求出 
使用扫描线,增大右端点并维护每个左端点的答案。
对子 
树状数组即可。
Part3
考虑如何求出 
使用点分治。对于点 
每个点 
考虑静态问题。将点按照大小排序,逐个插入以点编号为下标的线段树,线段树内维护
查询时,只能走存在 
这容易用线段树维护。总复杂度