根号算法

看的视频课,晕晕乎乎的看了不知道多久,快进&回放反复横跳。

有一些非常奇妙的收获,记录一下。

好乱啊。。。

 

分块:可以理解为深度为3,儿子数为$O(\sqrt{n})$的分治树。

普通莫队的比较优秀的块长是$\frac{n}{\sqrt{\frac{2m}{3}}}$

普通莫队可以奇偶性优化,即左端点块编号为奇数时右端点升序,偶数时降序。

回滚莫队解决不修改莫队问题。

带修莫对就是在普通的双参莫队上再加一维(前提是可撤销),时间复杂度是$O(n^{\frac{5}{3}})$的

树上莫队可以采用一种特殊的遍历序:进入时加入,回溯时加入,介于$dfs$序和$Euler$序之间的一种。

然后出现次数为奇数的有贡献,出现次数为偶数的没有贡献,再额外考虑一下$lca$的贡献即可。

然后就排在序列上可以乱弄了。

二次离线:我们对问题离线之后,问题产生的子问题不能合理解决,于是可以把子问题的询问再次离线。

类似分块套莫队之类的。

cache:内存大时运行较慢。这对根号算法的影响很大。

块状链表:支持$O(1)$查询第k大,O(\sqrt{n})插入或删除。将数列分为若干段然后维护多个队列,保证队列长度一定。

根号平衡:当两种操作数量级不同时,可以给次数较少的操作分配$O(\sqrt{n})$的复杂度以此为代价让操作次数多的达到$O(1)$

树上分块:(应对强制在线)。随机出根号个点,每个点离其它点的距离的期望是$O(\sqrt{n})$的。常数巨大。

复杂度优化:二分答案+分块时复杂度瓶颈在于两端的零散块(中间的两个log会被开根成一个)。考虑把零散块从二分中提出即可将整体复杂度降低。

区间逆序对数:差分+二次离线。经典题还要好好深究。

根号分治:也就是俗话讲的分大小点,小点暴力统计所有贡献以及处理好与大点的关系(类似懒标记)。大点只查找与其他大点的关系然后直接释放小点的标记。

可以分解质因数考虑的:可以利用大于$n^{\frac{1}{3}}$的质因子最多只有2个的性质,对于小质因子直接处理。

定期重构:对于复杂度没有保证的数据结构可以每$\sqrt{n}$次操作后就暴力整个重构一次来保证复杂度,总时间不大。

运用:动态点分治。不平衡时重构。

posted @ 2020-02-08 20:46  DeepinC  阅读(922)  评论(2编辑  收藏  举报