CF1550F Jumping Around 题解 / Boruvka 学习笔记

· · 题解

:::::info[闲话] 我咋从来没写过 Boruvka 的题,菜完了。
::::: :::::info[题目基本信息] 考察:最小生成树,并查集(2700)。
题目简介:
一个数轴上有 n 个点,位置编号构成序列 \{a_n\},现在你可以从 i 点跳跃到 j 点,跳跃条件为:

给定 s,dq 次询问,每次给出 t,k,问 s 能否通过若干次跳跃移动到 t 上。
数据范围:

进行若干轮这样的操作直到只剩一个点。
::::success[正确性] 容易发现第 1 步类似 Kruskal,第 2 步类似 Prim,Boruvka 的正确性可以通过前两者的正确性(不知道是不是严谨地)推出。
:::: ::::success[复杂度] 容易发现 1 轮最坏情况下是这些点两两配对,点数减少一半,所以设 T 为给每个点找到和它距离最近的点的时间复杂度,那么总时间复杂度就为 \Theta(n\log n\cdot T)
:::: ::::: 本题中套用 Boruvka,容易发现可以使用双指针的方式找到与 a_i+da_i-d 最接近的点,所以本题均摊下 T=\Theta(1)
然后做完了。
时间复杂度为 \Theta(n\log n+q),空间复杂度为 \Theta(n)

code