自己yy的一个奇怪东西

散步的时候yy区间最值的不同分块做法,发现单点修改\(O(\sqrt{n})\)查询\(O(1)\)的做法不是很会?

于是yy了一个奇怪做法,写出来看看。

考虑查询的时候两端的散点可以用前后缀最值查出来,所以只需要考虑中间的块。

中间这些块似乎比较恶心,不知道怎么做。

于是我们把每一个块的最值拎出来作为一个点,再分一次块,就成功地用\(O(1)\)的时间把问题变成了根号级别的子问题。

于是分块套分块套分块套……,似乎很对?

如果左右端点都在同一个块内那么不是很好玩,就对每一个块里面也分块,也是一个根号级别的子问题。

于是查询\(T(n)=T(\sqrt{n})+O(1)=O(\log \log n)\)

那么修改的时候呢?要更新这一个块里面的分块、更新总体的分块、更新前后缀,好像就是\(T(n)=2T(\sqrt{n})+\sqrt{n}\),也就是\(O(\sqrt{n})\)的。

复杂度一脸正确?

update:hz大佬优化了一下,发现只需要分两层,在第二层块数是\(O(n^{\frac 1 4})\)的,于是可以直接暴力维护任意两个块中间的最值。于是就真的是\(O(\sqrt{n})-O(1)\)了。

而且这东西似乎可以维护任意可加且有结合律的信息?

猜你喜欢

转载自www.cnblogs.com/p-b-p-b/p/11397441.html