好题推荐26.7~26.9

好题推荐&思路分析

这里主要目的是还原解题思路,因此这里的好题都是思路精简神奇但代码实现较为简单,以至于难以凑出一篇题解的。

很可惜,整个 7~9 月只找到了这一道满足这个要求的题。那结果不等价于单列了一篇题解吗

2026/7

数据结构相关

[SCOI2016] 萌萌哒

(update on 7/16)

由于某些原因,我开局就知道算法名称,所以这里先直接说结论:考虑倍增的并查集,具体来说,建一个类似于 ST 表的结构,使得 $ fa_{i,x} $ 表示 $ [i,i+2^x] $ 和 $ [fa_{i,x},fa_{i,x}+2^x] $ 相同。然后使用 ST 表的下放结构就做完了,复杂度 \(O(n \log n)\)。

接下来是一种我事后拟合出来的可能的分析:

通过注意力,发现可以用并查集之类的东西搞。朴素并查集的 30pts 是显然的。无非就是考虑区间优化,不妨考虑线段树优化建图。如果你见多识广,应该会见过一个叫“线段树优化建图”的东西。具体来说,一般地线段树优化建图如下:

一个节点,代表区间 $ [l,r] $,他连向(被连向)两个点,分别代表 $ [l,mid] $ 和 $ [mid+1,r] $,然后就用线段树的结构做就可以了。如果有一个点,想要向一个区间的点连边,那么就可以像线段树一样,像构成这个区间的 $O(\log) $ 个节点连边。

我们可以使用类似于线段树优化建图的思想,但是注意到,块之间的差不是整数(二进制下),所以我们理论上要对每个点为开始,建一棵线段树,也就是 \(O(n)\) 个线段树。具体地,对于每个 $[i,n](i \le n) $ 都要作为根节点建一次,这样才能保证复杂度。

但是显然是有很多点是重复的,至少叶子节点建一次就够。具体分析一下,假设当前层的区间长度为 $ W=2^{floor} $,那么对于这一层,只需要建 \(W\) 次就够了,第 \(i\) 次从 $ i $ 开始,当第 $ W+1 $ 次时恰好与第 \(1\) 次重合。这里的一次指正常线段树的一整层。

然后我们修改一下观察方式,敏锐地发现,这个东西不就是对于每个点,建了一个区间代表 $[i,i+W] $ 吗?然后这玩意的儿子们不就是 $ [i,i+2^{floor-1}]$ 和 $[i+2^{floor} -1 , i+W] $ 吗?到此为止,这玩意已经完全和上方的并查集重合了,省去了线段树繁杂的结构,退化成了类似于 ST 表的结构。

然后你就做完啦!

代码易写。

posted @ 2026-09-30 20:09  FarrisL  阅读(10)  评论(0)    收藏  举报