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