「赛前备战」NOIp2020-提高 图论训练

你说的曾经没有我的故事 提交于 2020-08-13 06:10:47

博主太菜,可能会炸联赛,于是恶补一下 QAQ

题目比较基础,动态更新

Tags

生成树最短路差分约束树的直径与重心LCA树链剖分拓扑序强连通分量 割点 点双连通分量边双连通分量2-SAT二分图正/负环最小环

Content

  • 「Codeforces 888G」Xor-MST 生成树
  • 「AtCoder JSC2019 Qual E」Card Collector 生成树

「Codeforces 888G」Xor-MST

update - 2020.8.4

此题需要用到一个叫 Borůvka 的最小生成树算法,大致就是对现在的每一个连通块都找一遍的最短边,最后每个连通块择优,将这些边全部连上。这样复杂度之正确的原因可以参考启发式合并,\(O(|E|\log |V|)\)

对于此题,我们以可以用这样的思路来“择优合并”,即选取两个结点 \(u, v\),使得 \(a_u \oplus a_v\) 最小,然后合并。现在如何找到这个最小的就是个问题。

对于两个二进制数 \(x = (10001010)_2,y = (10000110)_2\),前 \(4\) 位相同,即 \(\text{lcp} = 4\),那么异或一次前四位都是 \(0\)。我们优先考虑二进制下 \(\text{lcp}\) 较大的。

和前缀有关,于是可以断定是 01-Trie。转化到树上,lcp 就成了两个叶子的 LCA,那么我们就该优先考虑 LCA 深度较深的。

遍历整颗 Trie,找到这些 LCA,然后对于一个 LCA,枚举左儿子值域中的所有数 \(a_i\),然后在右子树中查询,并使路径上的 0/1 值尽量和 \(a_i\) 一样以达到异或后最小化的目的。最后这些查询的最小值的和即为所求。

时间复杂度 \(O(n\log n\log a)\)

「AtCoder JSC2019 Qual E」Card Collector

update - 2020.8.4

如果把每一行、列都视作一个点,把卡片视为边,我们会得到一个 \(w+h\) 个点, \(n\) 条边的图。若有一张第 \(i\) 行第 \(j\) 列的卡片,那么就视作一条结点 \(i\)\(h+j\) 之间的边,权值为卡片数值。

考虑题面上取卡片的过程如何转换到图上:我们假定图有向,那么在第 \(i\) 行取走第 \(j\) 列的卡片,就相当于一条 \(i\to j+h\) 的边;同理,在第 \(i\) 列取走第 \(j\) 行的卡片,就相当于一条 \(i + h\to j\) 的边。

试着研究最后取完建出的新图的性质。一个结点的出度最多为 \(1\),那么整个新图就是(内向)基环树的森林。最后将边转为无向。

题目要求权值最大化,那么就是求图上的最大生成基环树森林。要求最大生成基环树森林,可以仿照 Kruskal 算法贪心地取边,与一般 MST 的不同之处就是需要判环,实现要点是一个点所在连通块中最多一个环。

时间复杂度 \(O(n\log n)\)

Code : https://strncmp.blog.luogu.org/solution-at5168

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!