CF1464F My Beautiful Madness

发布时间 2023-07-20 17:18:34作者: Ender_32k

一发最优解祭(

Description

给定一棵树,节点 \(1\)\(n\) 标号,\(q\) 个操作,你需要维护一个路径可重集合 \(P\),操作一共三种:

  1. \(P\) 集合加入 \(u\to v\)
  2. \(P\) 集合中删掉 \(u\to v\)(保证操作之前有加入,并且只删一个)。
  3. 查询 \(P\) 集合中所有元素路径的 \(d\) 邻域的交集是否为空集。一条路径 \(p\)\(d\) 邻域定义为所有到 \(p\) 距离不超过 \(d\) 的点组成的点集。

Solution

考虑到难以求出所有路径的 \(d\) 邻域交集,因为这个集合大小是 \(O(n)\) 的,考虑一个最优决策点 \(v\) ,使得这个点尽量能被 \(P\) 中最多的路径邻域覆盖到。

\(low\)\(P\) 的元素路径中两个端点的 \(lca\) 深度最大的点,\(q\) 为这条路径,下证取 \(v=father_{d}(low)\) (即 \(low\)\(d\) 级祖先)时最优。即题目原命题成立当且仅当 \(v\) 在这个邻域交集中。

考虑 \(p\in P\),分情况讨论:

首先如果 \(p\) 有点经过 \(v\),那显然是可以取的。

\(lca_p\in subtree(v)\) ,即 \(p\) 路径的 \(lca\)\(v\) 的子树中,由 \(low\) 的深度最大的性质,显然有 \(dis(v,lca_p)\le d\)

\(lca_p\notin subtree(v)\),则 \(q\)\(p\) 必然不存在交集且 \(p\) 在 ,那此时决策点肯定尽量往上取,但是由于 \(low\) 的限制,\(v\) 的深度不能小于 \(dep_{low}-d\),那 \(v\)\(low\)\(d\) 级祖先是最优的。

所以我们可以维护出 \(low\)(具体可以使用 set 维护集合 \(P\) 所有路径 \(p\)\(lca\)),然后求出 \(v=father_d(low)\),判断 \(v\) 是否合法。

由于上面证明了 \(p\in P\)\(p\) 经过 \(v\) 或者在 \(v\) 的子树内都是合法的,那就考虑在 \(v\) 子树外的所有路径,它们到 \(v\) 的距离是否 \(\le d\),仍然分类讨论,令 \(u=father_d(v)=father_{2d}(low)\)

若有路径没有经过 \(u\) 的子树:说明这条路径在 \(u\) 的外部,那就不可能距离 \(v\le d\),直接判掉即可。

若所有路径都经过了点 \(u\) 的子树:那么只需要任意路径的 \(lca\)\(v\) 的最长距离不超过 \(d\) 即可。因为 \(v\) 经过子树的路径一定满足,并且其它的路径一定是 \(lca\)\(v\) 的距离最短。可以画图理解。

而这个最长距离可以用动态求子树直径解决,求出子树内以 \(lca(p)(p\in P)\) 为端点的最长路径 \(i\to j\),然后最长距离就是 \(\max\{dis(v,i),dis(v,j)\}\) 了。

判断是否所有路径都经过了某棵子树可以树上差分,对于一条路径 \(i\to j\),在 \(dfn_i,dfn_j\)\(+1\),在 \(dfn_{lca(i,j)}\)\(-1\),查询 \(u\) 子树和即可知道有多少条路径经过了 \(u\) 的子树。

然后动态求直径可以用线段树。基于一个基本结论:一个连通块 \(A\) 合并到另外一个连通块 \(B\) 上,新的直径端点必然在 \(A\) 直径端点、\(B\) 直径端点 \(4\) 个中取 \(2\) 个,于是对于每一段连续的 \(dfn\) 区间维护区间直径端点即可。

代码很好写,不放了。使用树剖求 \(father_k\),是 \(O(n\log^2 n)\) 的,但是如果换成欧拉序+ RMQ 的话可以达到 \(O(n\log n)\)