【2018icpc Dhaka G】Techland 题解
程序员文章站
2022-05-21 23:30:31
...
题目大意
有一棵 个点的树,点编号 ~。有 次操作,操作有三种类型:
:公司 在编号属于 的点上各开一家商店。如果该公司曾经有过商店,则它以前的商店全部清除,只算这次的。
:公司 的商店全部清除。
:有个人在 号点,他指定了他喜欢的公司为 ~,你要找到一个离 最近的点,使得这个点有他喜欢的公司开的商店。求这个距离。
单组数据:
10 组数据共 10s。
题解
对了…上次那个 G 题,我后来想了想发现是个点分水题.
——liyang21
由于 ,只需要对于每个 ,求 点到相应的 这些点的最短距离就好了。
你想,要是每个点 有一棵线段树,记录着 到所有点的最短距离,那就好了,就可以对于每个询问直接区间查询 的最小值了。
但这样太大了。想办法以时间换空间,我查询多一些东西,让这个线段树总量少些。
由于最近点是经典点分题,于是想到了点分
考虑点分树,对于每个点,只记录它的子树上的所有点到它的最短距离。你可以给点重新编号,或者用主席树,使得这个线段树总大小为 。
这样一来,点 到终点 的路径就被分为了两部分,第一部分是 到它点分树上的祖先 ,第二部分是 到 。
因此查询的话,就从点分树的根一直查到那个点。比如上面说的我查询点 ,现在考虑它点分树上的祖先 ,那么就是 ,这就是线段树区间查询了。点分树树高为 ,线段树查询有一个 ,因此复杂度为 。
代码
\\待填坑