P14380 【MX-S9-T3】「LAOI-16」天外来物
题意
给一棵树,每个点有编号,现在有一种树 \(f(l,r)\),形如把编号在 \([l,r]\) 之间的点连成最小生成树。
然后给一些询问,形如 \(q(L_i,R_i)\)。他想知道有多少种不同的 \(f(l,r)\),其中 \(L_i\le l\le r\le R_i\)。
称 \(f\) 相同,当且仅当其包含的点集相同。
对于所有测试数据,保证:
- \(1\le n,q\le 5\times 10^5\);
- \(1\le L_i\le R_i\le n\);
- \(1\le x,y\le n\),保证输入的边构成树。
题解
考虑每种 \(f(l,r)\) 的性质,必然 \(l\) 不变的情况下 \(r\) 递增,则 \(f(l,r)\) 的树是不变小的。有点单调的感觉,所以考虑找到每种树的分界点 \((l,r)\)。这里有个结论,就是这个 \(l,r\) 一定都是最小生成树的叶子,证明显然。
然后考虑每个点作为这种 \(l\) 或者 \(r\) 的最远扩展距离。这里我们可以这么想:对于 \(l\) 来说,如果把 \(l\) 当成根,那么必须经过 \(l\) 当且仅当 \(l\) 有至少 \(2\) 个子树有点,所以我们把这个东西放到 \(dfs\) 序上就是区间最大值了,枚举子树找到第二大就是答案。从小到大扫描每个点即可,\(r\) 的做法类似。
接下来考虑计算答案,我们设每个点能拓展的左右端点为 \(L_i,R_i\),询问区间为 \(l,r\),我们要找的两个叶子从小到大为为 \(x,y\)。那么我们要求的点对满足如下限制:
考虑扫描 \(y\),用线段树维护。具体来说线段树每个节点维护一个值 \(w_i\) 表示以 \(i\) 为左端点,右端点不超过 \(y\) 的树种类。我们维护一个 \(tag_i=[R_i\ge y]\) 那么一次扫描的增加会使得 \([l_y,y]\) 中的点变为 \(w_i+tag_i\)。发现 \(tag_i\) 只会改变一次,所以可以暴力修改 \(tag_i\),询问就是求区间和,线段树上每个节点维护 \(sumw,sumtag\) 就可以了。

浙公网安备 33010602011771号