zoukankan      html  css  js  c++  java
  • 根号算法

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

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

    好乱啊。。。

    分块:可以理解为深度为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}$次操作后就暴力整个重构一次来保证复杂度,总时间不大。

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

  • 相关阅读:
    17.07.28 SQL 函数
    JavaScript 数组去重
    JavaScript 之 DOM
    JavaScript 之 BOM
    JavaScript之Math
    JavaScript之String
    JavaScript之数组
    JavaScript之作用域
    JavaScript之函数
    JavaScript之循环
  • 原文地址:https://www.cnblogs.com/hzoi-DeepinC/p/12285037.html
Copyright © 2011-2022 走看看