CF1550F

题面

link

​ 数轴上有 \(n\) 个点。有一只青蛙初始时在 \(a_s\) 处。有两个参数 \(d,k\)。其中\(d\) 是确定的,而 \(k\) 是可以调整的。

  • 小青蛙能从 \(a_i\) 跳到 \(a_j\),当且仅当 \(d-k\leq |a_i-a_j|\leq d+k\)
  • \(q\) 次询问,每次给定一个灵活程度 \(k\) 和一个下标 \(i\),你需要回答:此时的小青蛙能否跳到 \(a_i\)

题解

​ 我们可以对于任意一对\(i,j(i<j)\)之间连了一条边权为\(|a_i+d-a_j|\)的边,最后问青蛙可不可以只通过权值\(\le k\)的边从\(a_s\)\(a_i\)

​ 那么我们可以建最小生成树,先求出到点\(i\)的需要的最小\(k\),最后再处理询问。

​ 但是边数有\(n^2\),肯定不行,这时候就有一个不同的最小生成树的算法——B算法。B算法是每次对所有联通块找到最小的连向其他联通块的边,然后做一次最小生成树,合并联通块。这样每次会使点集缩小到原来的 \(\frac{1}{2}\),只会重复 \(O(\log n)\) 次,这样就保证了复杂度。

​ 具体找最小的边我们可以对坐标维护一个set,每次我们寻找最小的边就是将\(a_i\pm d\)在去除了当前联通块内的点的set中lower_bound,找前驱后继,就可以了。这样复杂度就是\(O(n\log^2 n)\)的。

启发

  • 新的求最小生成树的算法,一般边数很多,但是对于一个点,我们可以快速找到链接该点且边权最小的边就可以用B算法做。

posted @ 2022-02-17 17:57  qwq_123  阅读(15)  评论(0编辑  收藏  举报