P5311 [Ynoi2011] 成都七中

我永远喜欢数据结构。

题目传送门

  • 给出 n 个点的树,点有颜色 ai。有 q 次询问,每次询问给出 l,r,x,求保留 [l,r] 范围内的节点时,x 所在联通块中有多少种本质不同的颜色。询问之间相互独立。

  • 保留一个点的定义是,将这个点以及与其相邻的边全部删除。

  • n,q105

  • 1.00s/250.00MB

lxl 难得不卡常。

一句话题解:转化,离线。

(l,r,x) 为一个询问,Sx,[l,r]x 能够通过 [l,r] 内的点走到的点的集合。询问本质上是对 Sx,[l,r] 数颜色。

我们发现若 ySx,[l,r],则询问 (l,r,x) 等价于 (l,r,y)。因为若 x 能走到一个点 u,那么 y 也可以通过 x 到达点 u,反之亦然。其实就是此时 Sx,[l,r]=Sy,[l,r]

考虑点分治,设当前分治重心为 rt。考虑对于当前子树内部一个点上未被处理的 (l,r,x) 的询问,若 rtSx,[l,r],则可以考虑求解 (l,r,rt) 的答案。

可以证明对于任意一个点一定存在一个这样的 rt

注意到此时 Srt,[l,r] 中的点全部在当前子树中。
若不在,则 x 一定和上层分治重心通过 [l,r] 内的点联通,本层就不会再处理这个询问。

于是维护 mxeumneu 表示 urt 的路径上最大 / 最小的点。那么对于一个颜色 c,它对这个答案有贡献,当且仅当存在一个点 v 使得 av=c,且 lmnevmxevr

这是个二维数点问题,考虑将所有询问和 (mnev,mxev) 点对按照第一维从大到小排序,从大到小扫描。扫到一个询问时,上述条件可以转化为当前有多少种颜色的最小 mxev 值不超过 r。用树状数组维护即可。

一个点在 O(logn) 层分治中,每层扫到一次,单次复杂度为 O(nlogn)。一个询问会在 O(logn) 层分治中被扫到,仅会在一层分治中回答,复杂度为 O(logn)

综上,时间复杂度为 O(nlog2n+qlogn),空间复杂度为 O(n+q)

提交记录(Accepted 100139ms/16.94MB 代码

posted @   lzyqwq  阅读(21)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示