题目链接
题意 : 给你一个大小为
n
n
n的树,我们想求解一个问题,问题的定义是找有多少条路径满足恰好满足路径的端点是路径的最小值
o
r
or
or最大值条件之一,【注】不能同时满足路径的两个端点是最小值又是最大值
现在增加
m
m
m个操作,每个操作接在
k
j
k_j
kj节点上,每次操作都要回答增加节点后的问题答案。
思路 :
[vp时思路] 我们可以很容易地发现这个问题可以离线,然后我们考虑离线,我们考虑怎么维护端点是路径的最大值
o
r
or
or最小值呢,我们考虑第一个
t
r
i
c
k
trick
trick-按照点的顺序重新合并点集。
第一步:我们先按
1
−
n
1-n
1−n的顺序遍历点集,每次合并只合并原树连在
i
i
i节点,且比
i
i
i节点小的点。
举个例子
4
1 2
2 3
1 3
我们连点的顺序是
1 - //1作为最大值的路径数为 0
2 - 1 //2作为最大值的路径数为 1
3 - 1 、2 //3作为最大值的路径数为 2
这样合并之后我们可以发现我们可以统计出以
i
i
i为最大值的路径数
A
A
A ——
i
i
i所在的连通块大小 -1。
第二步,我们按照
n
−
1
n-1
n−1的顺序遍历点,每次合并只合并原树连在
i
i
i节点,且比
i
i
i节点大的点。
我们可以得到以
i
i
i为最大值的路径数B ——
i
i
i所在的连通块大小-1 。
这个时候我们可以得出以 i i i为最大值or最小值的路径数,但是题目要求不能同时存在路径端点同时为路径的最小值 o r or or最大值,所以我们需要容斥一下,我们设C为端点同时为路径的最小值 o r or or最大值的数量,答案应该为 A + B − 2 C A + B - 2C A+B−2C 。
求解C的过程我只想到了用 b i t s e t bitset bitset暴力求交集,是 n 2 / 32 n^2/32 n2/32的复杂度,能不能过(应该会爆空间)待论。
[看题解】题意创造性的提出了两个概念即 [Min-rt树,Max-rt树] ,名字很抽象,但是我根据题解图文很快理解了这个树。
以上是原图和Max-RT树的对比,我们可以惊奇的发现,这个树就建立在我的合并过程上!我合并的时候,只需要把根节点(连通块的父节点)设置为权值最大值,我们就可以惊奇的发现可以得到这个神奇的树形结构。Min-RT类似。
我们仔细观察一下这个数有什么性质,我们可以直观的发现在Max-RT数上,如果 u u u是 v v v子树上的节点,我们 u , v u,v u,v路径的最大值一定是 v v v,换句话说在 u , v u,v u,v路径中,端点 v v v是路径 u , v u,v u,v的最大值。我们可以通过祖先关系/子树关系可以得到这些性质。
我们开始构造Max-RT树,Min-RT树。
我们把
a
n
s
u
ans_u
ansu定义为在只由
(
1
−
u
)
(1-u)
(1−u)构成的树中,
u
u
u作为最大值
o
r
or
or最小值的形成的路径条数。
我们发现在Max-RT树中
a
n
s
u
ans_u
ansu为
u
u
u子树的大小,在Min-RT树中,
a
n
s
u
ans_u
ansu为
u
u
u子树的高。
我们把
A
A
A+
B
B
B算出来并已经存到
a
n
s
u
ans_u
ansu中。
现在我们需要计算
C
C
C。
C
C
C我们可以发现是统计
u
,
v
u,v
u,v在Max-rt树
u
u
u是
v
v
v的子树节点,但Min-rt树
v
v
v是
u
u
u的子树节点的数量。
不难发现,这是一个经典问题,求解两个树交的思想可以解决掉此问题。可以参考学长博客的一些思路。
步骤:
1.我们先统计Max-rt的dfs序,统计子树大小。
2.遍历Min-rt,我们把路径节点用存起来(存的是该节点在Max-rt树的dfs序)(用树状数组维护单点加区间和),然后遍历到
u
u
u节点时,我们计算祖先节点在Max-rt树上有哪些是
u
u
u的子树,我们可以用树状数组的区间和求出,因为树状数组维护的就是祖先节点的dfs序。
代码