【题解】P5311 | 点分治 数据结构 数颜色

独立切掉的黑 Ynoi~~


首先无根树上连通块和路径的查询可以考虑点分治,进行点分治,每次统计包含分治中心的连通块。

因为连通性是可以传递的所以如果可以到达目前的分治中心,问题就转化成了以分治中心为根只经过 $[l,r]$ 可以到达的颜色数,看上去就能做很多了。

通过一次 dfs 处理出分治中心到每个点需要经过最大最小编号 $(p_i,q_i)$,接下来问题转化为平面上有若干带色点 $(p_i,q_i,col_i)$,每次数矩形 $[0,l]\times[r,+\infty]$ 的颜色数,考虑使用经典套路,把询问看作二维平面上的点,考虑每种颜色可以贡献到的询问,即会对 $p \leq l,q\geq r$ 的询问产生这个颜色的贡献,所以我们需要对这些右上矩形取并,并对这个区域加一,对这个右上的阶梯型加可以拆成轮廓上这些黑点的贡献。

每种颜色的矩形的个位数之和是 $O(\text{分治点数})$ 的,直接排序后使用一个指针扫出轮廓,然后矩形加单点查即可。

总共要做规模为 $O(n\log n)$ 的二维数点,时间复杂度 $O(n\log^2 n)$,点分治的大常数和数据结构的 $\log$ 是分开的,故常数很小。

posted @ 2024-01-02 12:23  寂静的海底  阅读(10)  评论(0编辑  收藏  举报  来源