Loading

【题解】SDOI 2017 天才黑客

将每条边看作一个一个入点,一个出点,入点向出点连长度为原边权的边。那么对于原来的点相关的边形成的新图的点将互相连边,边权为 trie 树上 lca 的深度,直接连的话是 \(O(m^2)\) 的,无法通过。

接下来的任务就是这个 trie 树上怎么优化连边,这不禁让我们想到虚树。关于虚树,一个简单有力的结论就是:令 \(b_i\) 为点集 \(\{a_i\}\) 按照 dfn 序排序后得到的结果,那么 \(\mathrm{lca}(a_i,a_j)\) 即为 \(a_i,a_j\) 对应在 \(b\) 序列上的位置形成的区间中,所有相邻两个节点的 lca 的 lca 。意思是,如果在 \(b\) 序列中,定义相邻一对节点的权值为 lca 的深度,那么 \(a\) 序列中两个元素的 lca 的深度即为 \(b\) 序列上的位置形成的区间中的最小权值。

这样的话,设计四排点:1. 前缀入点。 2. 前缀出点。 3. 后缀入点。 4. 后缀出点。 然后对应连边,这样的前后缀优化连边很好处理 "边权为区间最小值" 一类的情况。

代码:记录详情 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

posted @ 2021-09-23 17:05  Qiuly  阅读(54)  评论(0编辑  收藏  举报