首页 > 编程语言 >根号分治与莫队算法

根号分治与莫队算法

时间:2024-02-26 23:11:08浏览次数:22  
标签:暴力 复杂度 分治 算法 端点 莫队 根号

1.根号分治与分块

在预处理与询问的复杂度之间寻找平衡的一个算法,通常以根号为分界线。属于智慧的暴力。

1.1. 根号平衡

使用数学不等式对于阈值取一个值,使得复杂度最优。如果有阈值 \(B\),若问题有一部分暴力可以 \(O(B)\) 解决,另一部分可以 \(O(\frac{n}{B})\) 解决。那么根据基本不等式 \(a+b\geq 2\sqrt{ab}\) 得 \(B=\sqrt{n}\) 复杂度最优。这称之为根号平衡

1.2 分块

对于整块直接查询 \(O(\frac{n}{B})\),对于单点暴力修改 \(O(nB)\),使用根号平衡。得到一个暴力的数据结构,需要灵活地分析。

1.3 例题

I.

CF1207F Remainder Problem

对于询问,大于 \(\sqrt{n}\) 的暴力,小于的维护一张表 \(f_{i,j}\) 表示编号模 \(i\) 余 \(j\) 的数的总和

II.

Luogu P8572

首先前缀和容易想到,接着讨论 \(n,k\) 大小关系,\(n<k\) 可以打表,\(n>k\) 可以询问暴力查询。

III.

abc335_f

给读者留作思考练习

2.莫队算法

对于区间问题,常常会使用线段树维护,但是对于一些数据合并复杂度无法 \(O(1)\) 解决。所以不能使用,应当使用莫队算法。对于离线处理的查询问题,通过合理安排这些计算的次序,得到一个较优的复杂度

2.0 历史

关于莫队的来历,要知道这是一些OIer暴力时偶然得到的智慧结晶。

有些东西是做出来的,不是学出来的。

其实莫队是由莫涛队长系统总结并宣传的一种算法,由此命名。

2.1 例题

一个长度为 \(n\) 的序列,询问 \(m\) 次 \([L,R]\) 的区间内至少重复三次的数有多少。

应当暴力,拓展L,R边界。以查询左端点所在块为第一关键字、右端点大小为第二关键字,从小到大排序。

2.2 莫队拓展

2.2.1 带修莫队

问题加入修改

记录指令修改前后的值,记录查询时做过几次修改,对询问排序的优先级改为:第一关键字 L 所在块,第二关键字 R 所在块,第三关键字,做了几次修改。

然后暴力,带上更改到对应修改时间的操作。

2.2.2 回滚莫队

操作加入容易,删除难

询问排序相同,枚举左端点所在的块的所有询问。

左右端点在同一块的暴力统计,否则记录一个块尾到当前右端点的区间,每次暴力回滚添加元素,然后回溯还原。

2.2.3 树上莫队

问题在树上

将树变成一个序列,然后莫队处理。

标签:暴力,复杂度,分治,算法,端点,莫队,根号
From: https://www.cnblogs.com/life-of-a-libertine/p/18035816

相关文章

  • 自己卷自己的分治 NTT
    考虑如下卷积:\[f_i=\sum\limits_{j=1}^{i-1}f_jf_{i-j}\]仍然可以cdq分治计算。考虑当前在\([l,r]\),希望计算\([l,mid]\)贡献到\([mid+1,r]\)。若\(r-l<l\)那么\([1,r-l]\)都被算出,直接用\([1,r-l]\)和\([l,mid]\)卷两遍即可;否则\(l......
  • 猫树分治
    就是说,对于分治区间\([l,r]\),记\(mid=\lfloor\dfrac{l+r}{2}\rfloor\),对于\([l,mid]\)和\([mid+1,r]\)内的询问继续递归,把跨越两边的询问用左右的信息合并处理。P6240好吃的题目物品\(i\)有体积\(w_i\)和价值\(c_i\),多次询问,对\([l,r]\)做01背包,问体积\(\let......
  • 猫树分治
    就是说,对于分治区间\([l,r]\),记\(mid=\lfloor\dfrac{l+r}{2}\rfloor\),对于\([l,mid]\)和\([mid+1,r]\)内的询问继续递归,把跨越两边的询问用左右的信息合并处理。P6240好吃的题目物品\(i\)有体积\(w_i\)和价值\(c_i\),多次询问,对\([l,r]\)做01背包,问体积\(\let......
  • 不可根号 BSGS 时的若干解决办法
    许多题如果用\(O(\sqrtp)\)的\(\texttt{BSGS}\)会超时,下面是我见过的若干解决办法。前置知识:原根,离散对数,阶,BSGS。下文设原根为\(g\),\(\text{ord}_r(a)\)表示\(a\)模\(r\)的阶。科技重新平衡复杂度可以\(O(B+\frac{np}{B})\)求出\(n\)个数的离散对数,只是把原来......
  • 线段树分治&cdq分治&整体二分
    preface感觉三种分治算法容易搞混并不容易区分它们使用的场景和题目(虽然有些题目根据性质可以使用多种分治),所以还是要归纳一下线段树分治Part1主要是处理一类带有撤回的问题,也就是一次修改只对一段区间生效(这里的区间指的是时间)即区间修改,单点查询流程大致是把区间修改挂在......
  • 莫队算法学习笔记
    普通莫队形式¶假设\(n=m\),那么对于序列上的区间询问问题,如果从\([l,r]\)的答案能够\(O(1)\)扩展到\([l-1,r]\)\([l+1,r]\)\([l,r-1]\)\([l,r+1]\)(即与\([l,r]\)相邻的区间)的答案,那么可以在\(O(n\sqrt{n})\)的复杂度内求出所有询问的答案。实现¶离线后排序,顺序处理......
  • #根号分治,分块,dfs序#洛谷 7710 [Ynoi2077] stdmxeypz
    题目传送门分析首先把距离变成深度,用dfs序转成区间问题,考虑分块,散块直接改问题是整块,如果模数比较大,可以以深度为第一维下标差分标记,这样查询时就可以前缀和知道答案如果模数比较小,那么给该块打标记,查询时枚举模数即可,然后块长取1000,模数阈值取300,就能尽量减少时间代码#in......
  • #根号分治,分块#洛谷 5309 [Ynoi2011] 初始化
    题目传送门分析如果\(x\)比较大那么可以暴力修改,\(x\)比较小的话可以用数组打标记查询的时候对于暴力修改的部分可以分块,暴力修改的同时需要给块打标记如果\(x\)比较小的情况,一段区间相当于是中间很多段周期加上前后缀(当然可以直接区间减但是我被卡常了)我调的块长是160......
  • 莫队与分块
    【根号分治】例题:等差数列加给定一个长度\(n\)的数列,初始全都是0。(\(n\leq2\times10^5\))要求支持两种操作:\(1\;x\;y\;d\),表示把所有下标模\(x\)等于\(y\)的位置全部加上\(d\);\(2\;x\),表示查询\(a_x\)当前值。做法:对于所有\(x>\sqrtn\),我们直接暴力循环......
  • 『学习笔记』莫队
    Part0.目录概念普通莫队树上莫队带修莫队Part1.概念莫队是由莫涛提出的算法。莫队算法可以解决一类离线区间询问问题,适用性极为广泛。Part2.普通莫队普通莫队主要针对于多次区间询问的问题,基于分块的思想。过程如下:先将当前区间\([l,r]\)设为\([1,0]\),再每次......