「题解」洛谷 P8375 [APIO2022] 游戏(神仙分治)

\(\mathcal{O}(nk)\)

注意到这条链的特殊性,对每个点维护 \(l_u,r_u\),表示能到达 \(u\) 的特殊点中编号最大的点和 \(u\) 能到达的特殊点中编号最小的点,若 \(l_u\ge r_u\),此时出现了环。

对于一次修改暴力枚举 \(u\) 可达的点和可达 \(u\) 的点,更新 \(l,r\),不能更新立即退出。均摊分析可得,这样做的复杂度是 \(\mathcal{O}(nk)\) 的。

\(\mathcal{O}(n\sqrt{k})\)

注意到只需要判断 \(l\ge r\) 的特殊性,其实我们并不需要实时更新 \(l,r\),可以仅在必要时更新。

仍然沿用上面的做法,将特殊点分块,维护暴力做法 \(l,r\) 所在块的编号,不能更新则退出。

\(l,r\) 在同一块中,维护真实的 \(l,r\) 编号,暴力更新其他点。

复杂度 \(\mathcal{O}(n\sqrt{k})\)

\(\mathcal{O}(n\log{k})\)

考虑将 \(l,r\),看作一个区间,挂在线段树分治结构上,满足 \(l\le \text{mid}<r\),只维护 \(l,r\) 所在线段树区间的左右端点。

此时分类讨论相邻点 \(u\to v\) 间的贡献。

  • \(u,v\) 在线段树上同点,此时没有任何贡献,直接返回。
  • \(u,v\) 线段无交,\(u,v\) 有贡献当且仅当 \(u\)\(v\) 右边,并且此时出现了环。
  • \(u\) 包含 \(v\),此时若 \(v\)\(u\) 右子树内,\(u\) 在线段树上对应的区间也会相应地到达右子树内,递归维护;否则 \(v\)\(u\) 左子树内,没有贡献。
  • \(v\) 包含 \(u\) 类似讨论即可。

复杂度 \(\mathcal{O}(n\log{k})\)

posted @ 2023-05-19 21:34  Network_Error  阅读(30)  评论(0)    收藏  举报