题解 P5397 【[Ynoi2018]天降之物】

· · 题解

第一个正宗过的大分块 qwq

lxl 在他的博客里说了存在序列分块方法然后我不会根号分治所以。。。

考虑序列分块,每一块里面维护某个值的第一个出现位置,某一个值的最后一个出现位置,和两个值之间在块内最小距离。

如果直接维护每一个块需要 O(n^2) 个信息,内存炸。注意一个块里面最多有 O(\sqrt n) 个互异值,所以可以对每一个块维护离散化,只需要维护 O(n) 个信息了。

现在询问就可以模拟,考虑怎么修改。如果在一个块想把 x 修改成 y,有三个情况:

然后就好了么?快乐的提交上去,30 分,都跑不过暴力。

开始卡常。

然后就终于好了。