首页 > 编程语言 >分块与莫队算法

分块与莫队算法

时间:2024-02-08 20:11:06浏览次数:27  
标签:分块 个块 sqrt 算法 区间 莫队

1. 分块

分块的思想

分块是把一个长度为 \(N\) 的数列分为 \(\sqrt{N}\) 个块,每个块的长度为 \(\sqrt{N}\)。这样在区间操作的时候,对于每个涉及到的块,如果涉及到半个块,就直接操作;如果涉及到整个块,就整体操作。

下面通过例题来了解一下分块。

例1 洛谷-P3372

这道题可以用分块来做。

先把序列分为 \(\sqrt{N}\) 个块,用 \(sqr\) 表示块的数量,\(sum_i\) 表示第 \(i\) 个块中所有数的和,\(add_i\) 表示第 \(i\) 个块中所有标记的总和,\(len_i\) 表示第 \(i\) 个块的大小。

  • 区间修改

先判断 \(x,y\) 是否在同一个块,如果是就直接求和并输出。

否则再判断 \(x\) 是否为所在块的左端点,如果不是,就把这个块中 \(x\) 及其右边的数都直接加上 \(k\),并把 \(x\) 移动到下一个块。\(y\) 的移动同理。

接下来把 \(x,y\) 所在块中间的块的标记都加上 \(k\) 即可。

  • 区间查询

原理和区间修改相同。只不过在加整块的时候,需要加的是 \(add_i \times len_i\)

这样总时间复杂度为 \(\mathcal{O}(M \sqrt{N})\),可以通过此题。

代码

例2 洛谷-P3373

和 例1 类似,区间标记可以参考线段树

2. 基础莫队算法

基础莫队思想

基础莫队算法是一种离线算法。它适用于只查询不修改的区间问题。

基础莫队算法是基于分块的。它一般将所有操作读入后,按照块排序,然后处理并输出。

下面根据例题来理解一下基础莫队算法。

例1 洛谷-P3901

下面给出不同的解法。

  1. 扫描法

定义两个指针 \(L,R\),用 \(cnt_i\) 表示区间 \([L,R]\) 中每个数的出现次数。两个指针可以移动。当 \(L\) 左移或 \(R\) 右移时,区间中会加入一个数;当 \(L\) 右移或 \(R\) 左移时,区间中会减少一个数。设 \(ans\) 表示此时区间中不同数的个数。加入后,如果这个数的出现次数为 \(1\),则让 \(ans \leftarrow and+1\)。减少后,如果这个数的出现次数为 \(0\),则让 \(ans \leftarrow ans-1\)。

这样可以对所有查询按左端点排序,每次通过移动指针来查询。这样的时间复杂度最差为 \(\mathcal{O}(NQ)\),不能通过。

  1. 基础莫队算法

基础莫队算法先将序列分块,然后将所有操作按左端点的块来排序,如果左端点的块相同,再按右端点排序。

这样看起来其实没啥优化,但是下图可以充分体现效果。用 \(L\) 表示横坐标,\(R\) 表示纵坐标,所有线段的长度即为两个指针移动的距离。

这样所有 \(\sqrt{N}\) 个块中,\(L\) 最多移动 \(Q \sqrt{N}\) 次,\(R\) 最多移动 \(Q \sqrt{N}\) 次。所以总时间复杂度为 \(\mathcal{O}(Q \sqrt{N})\),可以通过此题。

代码

标签:分块,个块,sqrt,算法,区间,莫队
From: https://www.cnblogs.com/lrxmg139/p/18012102

相关文章

  • 2024牛客寒假算法基础集训营1
    D.数组成鸡题解观察到\(abs(M)\leq1e9\),容易知道如果绝对值不为\(1\)的数的个数大于\(30\)个的话,显然溢出,不会在答案的范围内再仔细分析性质,如果整个数组中数的种类超过了\(20\)种,那么除了\(0\)之外,最坏的结果就是\(-10,-9...-1,1,2,...10\)这样的情况,他们......
  • 2024牛客寒假算法基础集训营1 补题
    2024牛客寒假算法基础集训营1补题A.DFS搜索模拟题意:给你一个字符串\(S\),求出\(S\)中是否存在子序列“DFS“和"dfs"。思路:直接模拟即可参考代码:#include<bits/stdc++.h>usingnamespacestd;#definefffirst#definesssecond#defineebemplace_back#define......
  • 差分约束算法
    一、题目描述P5960【模板】差分约束二、题目简析差分约束问题的典型特征是一组不等式。只要画出约束图,这类问题都可以准换为最短路径问题。注意:约束图是有向图。2.1约束图的顶点约束图的顶点(\(V\))=一个未知数对应一个顶点(\(v_1,v_2,...,v_n\))+一个额外的顶点(\(v_0\)......
  • 2024牛客寒假算法基础集训营3
    2024牛客寒假算法基础集训营3A.智乃与瞩目狸猫、幸运水母、月宫龙虾思路:就是一个简单的字符串#include<bits/stdc++.h>usingnamespacestd;voidsolve(){stringa,b;cin>>a>>b;if(a[0]==b[0]||a[0]-'A'+'a'==b[0]||b[0]-'A'+'a'==......
  • 代码随想录算法训练营第十五天| 层序遍历 10 226.翻转二叉树 101.对称二叉树 2
    层序遍历  102.二叉树的层序遍历-力扣(LeetCode)思路:结合了昨天学到的标记法,每当一层遍历完,向队列中添加一个NULL标记。遍历到NULL节点表示该层遍历完了,将结果存入结果集中。/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNo......
  • 【教3妹学编程-算法题】3028. 边界上的蚂蚁
    3妹:2哥,今天春节回的去吗?最火春运遭遇最强暴雪:冻雨像刨冰2哥:听说湖北的高速、高铁都已经停了。3妹:是啊,如果是雪还好办,可以除雪,冻雨就比较难办了。2哥:哎,好多人都滞留的高铁站了,没法回家了3妹:也有好多人滞留在高速上面,急的像热锅上的蚂蚁,惨。2哥:3妹,要不别回去了吧,我们就地过......
  • TCP拥塞控制算法初步介绍
    TCP拥塞控制算法初步介绍写得较为浅显,若有错误的地方还请指正.一、TCP拥塞控制:让发送方自己感知网络的拥塞程度并限制其能向链接发送流量的速率.限制方法:设置LastByteSent-LastByteAcked<=min{cwnd,rwnd}即已发送而未被确认的流量小于等于两个窗口长其中,cwnd......
  • SSL证书使用了弱Hash算法漏洞修复
    首先确认端口号,如果为3389端口,那就是远程桌面服务中的算法有弱Hash算法。在Windows中打开计算机配置-管理模板-Windows组件-网络-SSL配置设置查看配置中是否存在包含MD2、MD3、MD4、MD5、SHA-1等算法,如果有就删掉。将配置算法粘贴到一个文本文件中修改时注意官方的修改方......
  • 【国产化】禁止使用不安全的密码算法:DES、RC2,RSA(1024位及以下),MD5,SHA1
    一、引言随着互联网的普及和技术的发展,网络安全问题日益严重。密码算法作为网络安全的基石,其安全性直接关系到用户数据的安全。一些不安全的密码算法不断被曝光,给用户带来了极大的安全隐患。二、不安全的密码算法1.DESDES(DataEncryptionStandard)是一种对称加密算法,自1977年......
  • PowerShell 的 Get-FileHash 命令查询一个文件的所有上述哈希值(假设是 SHA256, MD5, S
    PowerShell是一种跨平台的任务自动化解决方案,包含一个命令行外壳、脚本语言和配置管理框架。PowerShell提供了用于计算文件哈希值的内置命令Get-FileHash。Get-FileHash命令可以用来计算文件的哈希值,支持多种哈希算法。,Get-FileHash支持以下几种哈希算法:SHA256:默认算法,提......