标签:复杂 单点 中间 -o rac 就是 class 级别 端点
散步的时候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)\)了。
而且这东西似乎可以维护任意可加且有结合律的信息?
标签:复杂 单点 中间 -o rac 就是 class 级别 端点
原文地址:https://www.cnblogs.com/p-b-p-b/p/11397441.html