浅谈根号分治与分块

news2024/11/20 4:38:05

文章目录

    • 1. 根号分治
      • 哈希冲突
    • 2. 线性分块
      • 引入
      • 教主的魔法
      • [CQOI2011] 动态逆序对
      • [国家集训队] 排队
      • [HNOI2010] 弹飞绵羊
      • 蒲公英

1. 根号分治

哈希冲突

题目1

n n n 个数, m m m 次操作。操作 1 为修改某一个数的值,操作 2 为查询所有满足下标模 x x x 等于 y y y 的数之和。

先来看两个暴力算法:

  • 算法 1:

    修改:直接修改。时间复杂度 O ( 1 ) O(1) O(1)
    查询:枚举下标模 x x x 等于 y y y 的数的和。时间复杂度 O ( n ) O(n) O(n)

  • 算法 2:

    先预处理出 f ( i , j ) f(i,j) f(i,j) 表示下标模 i i i 等于 j j j 的数之和。时间复杂度 O ( n 2 ) O(n^2) O(n2)
    修改:修改所有 i i i 下的 f ( i , x   m o d   i ) f(i,x\bmod i) f(i,xmodi)。时间复杂度 O ( n ) O(n) O(n)
    查询:直接查询。时间复杂度 O ( 1 ) O(1) O(1)

容易想到划定一个界限 B B B 选择使用的算法。

x x x 较大时,即 x > B x>B x>B 时,算法 1 的查询次数会较小,复杂度 O ( N B ) O(\frac N B) O(BN)

当我们仅用算法 2 处理模数 i i i 较小的情况时,即 i ≤ B i\le B iB 时,算法 2 复杂度会较低,预处理复杂度 O ( B 2 ) O(B^2) O(B2),修改复杂度 O ( B ) O(B) O(B)

总时间复杂度 O ( B 2 + m ( N B + B ) ) O(B^2+m(\frac N B + B)) O(B2+m(BN+B))。在 B = N B=\sqrt N B=N 时复杂度最低。

代码


2. 线性分块

引入

题目

给定 n n n 个数 a [ 1.. n ] a[1..n] a[1..n] m m m 次操作,区间修改,区间查询。

我们将数列分段,设块长为 B B B

对于区间 [ L , R ] [L,R] [L,R] 的询问:

  • L , R L,R L,R 在同一个块内,直接暴力枚举 [ L , R ] [L,R] [L,R] 统计。

  • L , R L,R L,R 不在同一个块内,则将 [ L , R ] [L,R] [L,R] 分成左右两个散块以及中间若干整块。对于每个整块,我们事先预处理出每个整块的 b i = ∑ a i b_i=\sum a_i bi=ai。对于散块,暴力统计。

    时间复杂度至多 O ( B + N B ) O(B+\frac N B) O(B+BN)

对于区间 [ L , R ] [L,R] [L,R] 的修改:

  • L , R L,R L,R 在同一个块内,直接暴力枚举 [ L , R ] [L,R] [L,R] 修改。

  • L , R L,R L,R 不在同一个块内,则将 [ L , R ] [L,R] [L,R] 分成左右两个散块以及中间若干整块。对于每个整块,我们修改整块的 b i b_i bi。对于散块,暴力修改。

    时间复杂度至多 O ( B + N B ) O(B+\frac N B) O(B+BN)

B = N B=\sqrt N B=N 时最优。

代码


教主的魔法

题目

给定 n n n 个数, m m m 次操作。区间修改,区间查询有多少个数 ≥ k \ge k k

设块长为 B B B

  • 对于区间 [ L , R ] [L,R] [L,R] 的询问:

    与上题基本一样,但是我们需要快速统计出整块中有多少个 ≥ k \ge k k 的数。考虑将所有整块内元素排序后二分查找。

    时间复杂度至多 O ( B + N B log ⁡ B ) O(B+\frac N B \log B) O(B+BNlogB)

  • 对于区间 [ L , R ] [L,R] [L,R] 的修改:

    修改整块并不会改变排序后的相对位置,记录标记表示增加的量即可。

    而对于散块的修改,可能会改变所在块的相对位置,我们暴力修改后重新排序。

    时间复杂度至多 O ( B + log ⁡ B + N B ) O(B +\log B + \frac N B) O(B+logB+BN)

复杂度最低时, B B B 的大小应该为 N \sqrt N N 左右(略大于 N \sqrt N N ,取 N \sqrt N N 也能过)。

代码

同类题 :Array Transformer (附代码)


[CQOI2011] 动态逆序对

题目

给定 n n n 个数的一个排列, m m m 此操作。每次删一个数,问删前逆序对个数。

删除一个数后,逆序对数量会减少这个数的贡献。第 i i i 个数的贡献为 [ 1 , i ) [1,i) [1,i) 中比 i i i 大的个数加上 ( i , n ] (i,n] (i,n] 中比 i i i 小的个数。和上一题类似,可以用二分或者树状数组解决。

代码


[国家集训队] 排队

题目

给定 n n n 个数 h 1 . . . h n h_1...h_n h1...hn m m m 次操作。每次操作交换两个数,问操作前的逆序对个数。

和上一题一样,考虑两个数交换前和交换后的贡献。

代码

双倍经验 :Anton and Permutation (附代码)


[HNOI2010] 弹飞绵羊

题目

题意见题面。

考虑预处理出 s t e p [ x ] step[x] step[x] 表示从 x x x 处开始弹几步能弹到下一块, p o s [ x ] pos[x] pos[x] 表示从 x x x 开始第一次弹到下一块的位置在哪里。

查询:每次跳到下一块,复杂度为 O ( N B ) O(\frac N B) O(BN)
修改:记修改点为 x x x ,所在块为 B B B ,块对应区间为 [ L B , R B ] [L_B,R_B] [LB,RB] ,那么可能会对 [ L B , x ] [L_B,x] [LB,x] 上的点的 p o s pos pos s t e p step step 造成影响。复杂度 O ( B ) O(B) O(B)

B = N B=\sqrt N B=N

代码

双倍经验 :Holes (附代码)


蒲公英

题目

静态求区间众数,强制在线。

分析:

  • n ≤ 4 × 1 0 4 , a ≤ 1 0 9 n\le 4 \times 10 ^ 4, a\le 10^9 n4×104,a109 ,考虑离散化。

  • 由于众数不满足一些性质(如可加性等),无法方便的用一些数据结构维护出来,考虑分块。

Solution

我们将序列分成 K K K 段,每段长度 N K \frac {N}{K} KN (左右)。

对于一次询问 [ l , r ] [l,r] [l,r] ,将其划分为若干整块和两块散块:
在这里插入图片描述

那么,答案一定为蓝色区间的众数或者红色区间出现过的数字。

考虑预处理出任意 i i i j j j 块间的众数,来快速求出蓝色区间的众数,预处理时间复杂度 O ( K 2 N ) O(K^2N) O(K2N)

// cnt[i][j][x] : x 在 i 到 j 块间出现的次数
// num[i][j] : i 到 j 块间的众数
	for(int i=1; i<=n; i++)
    {
        int B = ceil((1.0 * i) / (1.0 * len));
        belong[i] = B;
        cnt[B][B][a[i]] ++ ;
    }
	
	for(int i=1; i<=n; i++)
	{
		int B = ceil((1.0 * i) / (1.0 * len));
        if(cnt[B][B][a[i]] == cnt[B][B][num[B][B]] && a[i] < num[B][B]) num[B][B] = a[i];
        if(cnt[B][B][a[i]] > cnt[B][B][num[B][B]]) num[B][B] = a[i];
	}
	
    for(int i=1; i<=k; i++)
        for(int j=i+1; j<=k; j++)
            for(int x=1; x<=tot; x++)
            {
                cnt[i][j][x] = cnt[i][j-1][x] + cnt[j][j][x];
                if(cnt[i][j][x] == cnt[i][j][num[i][j]] && x < num[i][j]) num[i][j] = x;
                if(cnt[i][j][x] > cnt[i][j][num[i][j]]) num[i][j] = x;
            }
    

对于每次询问,我们 O ( 1 ) O(1) O(1) 求蓝色区间的众数, O ( N K ) O(\frac N K) O(KN) 枚举红色区间的数,计算 [ l , r ] [l,r] [l,r] 的众数,询问时间复杂度 O ( M N K ) O(M \frac N K) O(MKN)

总时间复杂度 O ( N K 2 + M N K ) O(NK^2+M \frac N K) O(NK2+MKN),如果我们认为 N , M N,M N,M 同构,那么 K = N 1 3 K=N^{\frac 1 3} K=N31 时复杂度最低。

代码


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/418786.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

一、基础算法6:双指针算法 模板题+算法模板(最长连续不重复子序列,数组元素的目标和,判断子序列)

文章目录算法模板双指针算法模板最长连续不重复子序列模板暴力法双指针算法数组元素的目标和模板判断子序列模板模板题最长连续不重复子序列原题链接题目题解数组元素的目标和原题链接题目题解判断子序列原题链接题目题解算法模板 双指针算法模板 for (int i 0, j 0; i <…

ForkJoinPool + RecursiveTask 来计算数组元素和

ForkJoinPool 是什么&#xff1f; ForkJoinPool 是一个 Java 并发编程框架&#xff0c;用于解决分治算法中的任务拆分、执行、合并等问题&#xff0c;是 Java 7 引入的一个新的工具类。 ForkJoinPool 的基本思想是将一个大任务划分成若干个小任务&#xff0c;然后并行执行这些…

SQL AVG函数

SQL AVG函数 SQL AVG函数简介 SQL AVG函数是一个聚合函数&#xff0c;用于计算集合的平均值。 以下说明了SQL AVG函数的语法&#xff1a; AVG([ALL|DISTINCT] expression)如果使用ALL关键字&#xff0c;AVG函数将获取计算中的所有值。 默认情况下&#xff0c;无论是否指定&a…

python+vue 图书馆读者行为分析系统-书友会

本系统主要包括以下功能模块&#xff1a;个人中心、用户管理、图书信息管理、图书分类管理、热门图书管理、书友会管理、报名信息管理、行为分析管理、在线论坛、系统管理等模块&#xff0c;通过这些模块的实现能够基本满足日常图书馆读者行为分析系统的操作。结合相关设计模式…

生成式 AI 与强人工智能:探索 AI 技术的未来

AIGC&#x1f388; AIGC&#xff08;AI Generated Content&#xff09; 即人工智能生成内容&#xff0c;又称“生成式 AI”&#xff08;Generative AI&#xff09;&#xff0c;被认为是继专业生产内容&#xff08;PGC&#xff09;、用户生产内容&#xff08;UGC&#xff09;之…

rust中的集合容器(切片和哈希)与错误处理

String、数组[T:n]、列表Vec\哈希表HashMap<K,V>等。 切片slice&#xff1b; 循环缓冲区 VecDeque、双向列表 LinkedList等。(这是指双向链表吗&#xff1f;) 这些集合容器的共性&#xff1a; 可以遍历 可以进行 map-reduce操作。 可以从一种类型转换成另一种类型。 主要…

VUE使用el-ui的form表单输入框批量搜索<VUE专栏三>

针对form表单的输入框单号批量查询&#xff0c;这里用换行符进行分割&#xff0c;注意v-model不要使用.trim 前端代码&#xff1a; <el-form-item label"SKU编码:" prop"prodNumbers"><el-input type"textarea" :rows"4" pla…

阿里数学竞赛决赛名单公布:北大人数是清华4倍 | 最小仅14岁

4月10日消息&#xff0c;第二届阿里巴巴全球数学竞赛决赛入围名单公布&#xff0c;全球12个国家516位选手晋级&#xff0c;晋级率仅有1&#xff05;。 根据参赛者填报信息&#xff0c;晋级选手80&#xff05;以上是90后&#xff0c;年纪最小的只有14岁。 入围人数最高的前20所高…

【Linux】git命令(基础,新手)

文章目录1.查看当前git版本信息2.安装git3.将远端仓库克隆到本地4.三板斧第一招&#xff1a;git add5.三板斧第二招&#xff1a;git commit6.三板斧第三招&#xff1a;git push7.对仓库文件进行更改8.查看使用提交日志9.查看本地与远端的同步状态10.从远端仓库拉取最新版本文件…

ChatGPT Plus价格太贵,可以约上三五知己一起上车体验一下,这个项目就能帮到你

❝ 对于想体验ChatGPT PLus的小伙伴&#xff0c;可能觉得自己一个人一个月花费20美元&#xff0c;相对于人民币每月137多&#xff0c;确实是一个不少的开支&#xff0c;如果&#xff0c;几个人合作一个账号&#xff0c;这样负担就减少了。刚好&#xff0c;最近逛github发现刚好…

深度学习-第R2周——LSTM火灾温度预测

深度学习-第R2周——LSTM火灾温度预测深度学习-第R2周——LSTM火灾温度预测一、前言二、我的环境三、前期工作1、导入数据集2、数据可视化四、构建数据集1、设置x,y2、归一化3、划分数据集五、构建模型六、模型训练1、编译2、训练七、评估1、loss图2、预测深度学习-第R2周——L…

MySQL数据库实现主主同步

前言 MySQL主主同步实际上是在主从同步的基础上将从数据库也提升成主数据库&#xff0c;让它们可以互相读写数据库&#xff0c;从数据库变成主数据库&#xff1b;主从相互授权连接&#xff0c;读取对方binlog日志并更新到本地数据库的过程,只要对方数据改变&#xff0c;自己就…

K均值聚类分析流程

K均值聚类分析流程 一、案例背景 在某体育赛事中&#xff0c;意大利、韩国、罗马尼亚、法国、中国、美国、俄罗斯七个国家的裁判对300名运动员进行评分&#xff0c;现在想要通过评分上的差异将300名选手进行分类&#xff0c;计划将选手分为高水平、中水平、低水平三个类别。因…

Unity2D 商业游戏案例 - 梦幻西游(第二季 框架设计篇)

00 网址 来源 siki学院的&#xff08;1年有限期到期前下载的项目&#xff0c;现在已经过期&#xff0c;所以自己理清项目&#xff09; 所以更多的不是学习这个项目&#xff0c;而是学习理清该类型的项目的思路 Unity2D 商业游戏案例 - 梦幻西游&#xff08;第二季 框架设计篇&…

python+vue 在线考试系统的设计与实现

1.用户登录 用户要通过本系统查询对课程信息进行下载&#xff0c;必须先输入用户名和密码进行登陆。为了避免非其他人员都可以获得登陆权限&#xff0c;登陆系统不设注册过程&#xff0c;所有用户和教师的登陆信息将事先由管理人员直接对数据库进行录入。 2.教师 教师登录系统后…

【排序】排序这样写才对Ⅱ -冒泡排序与快速排序Ⅰ

Halo&#xff0c;这里是Ppeua。平时主要更新C语言&#xff0c;C&#xff0c;数据结构算法......感兴趣就关注我吧&#xff01;你定不会失望。 &#x1f308;个人主页&#xff1a;主页链接 &#x1f308;算法专栏&#xff1a;专栏链接 我会一直往里填充内容哒&#xff01; &…

【Spring6】| Spring6整合JUnit

目录 一&#xff1a;Spring6整合JUnit 1. Spring对JUnit4的支持 2. Spring对JUnit5的支持 一&#xff1a;Spring6整合JUnit 1. Spring对JUnit4的支持 准备工作&#xff1a;pom.xml 注&#xff1a;以前是直接使用单元测试Junit&#xff0c;现在使用Spring对Junit的整合&…

快递电子运单上,电话应隐藏6位以上,禁止显示这些信息

我国快递年业务量达千亿件&#xff0c;快递电子运单是应用于快递外包装的重要单据&#xff0c;每年耗用量很大。在强化个人信息保护方面&#xff0c;《快递电子运单》国家标准要求快递企业、电商经营主体等采取措施&#xff0c;避免在电子运单上显示完整的收寄件人个人信息。 …

【机器学习】P14 Tensorflow 使用指南 Dense Sequential Tensorflow 实现

Tensorflow 第一节&#xff1a;使用指南Tensorflow 安装神经网络一些基本概念隐藏层和输出层&#xff1a;神经元的输出公式Tensorflow 全连接层 Dense 与 顺序模型 SequentialDense LayerSequential Model代码实现一个神经网络实现方式一&#xff1a;手写神经网络* 实现方式二&…

JavaScript基础入门全解析(上)

JavaScript基础语法 什么是JavaScript&#xff08;简称js&#xff09; 1.首先了解前端页面的组成&#xff08;前端页面的三层结构&#xff09; ●HTML 表示了你的页面内有什么&#xff0c;组成页面的骨架 &#xff08;结构层&#xff09; ●CSS 表示了你的页面中每一个内容是…