题解:P7126 [Ynoi2008] rdCcot
树上圆理论好。
对于任意两个点 \(u,v\) 满足 \(\operatorname{dist}(u,v)\leq C\),在 \(u,v\) 间连边,那么相当于要查询连通块个数。
直接考虑精妙的一步,对所有点求出 BFS 序 \(b_u\)。观察性质:对于三个不同的点 \(i,j,k\) 满足 \(b_i<b_j<b_k\),若 \(\operatorname{dist}(i,k)\leq C\) 且 \(\operatorname{dist}(j,k)\leq C\),则 \(\operatorname{dist}(i,j)\leq C\)。
证明
设 \(p=\operatorname{lca}(i,k)\),\(q=\operatorname{lca}(j,k)\)。
不妨设 \(dep_p\leq dep_q\),则
\(dep_p>dep_q\) 的情况同理。\(\Box\)
按 \(b\) 从小到大加入 \([l,r]\) 内的点,每次加入一个点 \(u\) 时,考虑所有在 \(u\) 之前被加入且与 \(u\) 有连边的点,那么根据上述性质,这些点必然已经连通,加入一个点不会导致连通块的合并。
于是 \([l,r]\) 的连通块个数,就是与先前加入的点没有连边的点数。
考虑求出
那么查询相当于求有多少 \(l\leq i\leq r\) 满足 \(prv_i<l\land nxt_i>r\)。对于每个 \(i\),其能造成贡献的查询满足 \(prv_i<l\leq i\land i\leq r<nxt_i\)。于是问题转化为矩形加,单点查,扫描线直接做就是 \(\mathcal{O}((n+m)\log{n})\) 的。
不妨钦定生成的 BFS 序以深度为第一关键字、节点编号为第二关键字。那么 \(prv_i\) 相当于在 \(<i\) 的点中求 \(dep_j\leq dep_i\land \operatorname{dist}(i,j)\leq C\) 的最大点,\(nxt_i\) 把条件改为 \(dep_j<dep_i\) 即可。
设 \(C(u,r)\) 表示以 \(u\) 为圆心,\(r\) 为半径的树上圆,\(\operatorname{anc}(u,k)\) 为 \(u\) 的 \(k\) 级祖先。
注意到 \(dep\) 的限制相当于 \(C(1,r_1)\),于是考虑如何求出 \(C(1,r_1)\cap C(i,r_2)\)。
若 \(r_2\geq d+r_1\),则交为 \(C(1,r_1)\)。
否则设 \(d=\operatorname{dist}(1,i)\),则新的圆的直径为 \(r_1+r_2-d\),圆心到 \(i\) 的距离为 \(\dfrac{d-r_1+r_2}{2}\)。若 \(d-r_1+r_2\) 为偶数,则交为 \(C(\operatorname{anc}(u,\dfrac{d-r_1+r_2}{2}),\left\lfloor\dfrac{r_1+r_2-d}{2}\right\rfloor)\);若 \(d-r_1+r_2\) 为偶数,则交为
求 \(prv_i\) 时,按编号从小到大加点,问题转化为查询树上圆内最大编号。建出点分树,每个点 \(u\) 上维护一棵大小为 \(sz_u\)、以 \(dis\) 为下标的维护前缀最大值的树状数组即可。求 \(nxt_i\) 是同理的。
时间复杂度为 \(\mathcal{O}(n\log^2{n}+m\log{n})\),空间复杂度为 \(\mathcal{O}(n\log{n})\)。
树状数组常数很小,可以轻松跑过去。

浙公网安备 33010602011771号