首页 > 其他分享 >基本技巧——根号分治 学习笔记

基本技巧——根号分治 学习笔记

时间:2023-09-28 18:12:58浏览次数:37  
标签:复杂度 分治 笔记 算法 sqrt https com 根号

基本技巧——根号分治 学习笔记

根号分治与其说是一个算法,更不如说是一种思想(trick)。

定义

根号分治,是一种对数据进行点分治的分治方式,它的作用是优化暴力算法;类似于分块,但应用范围比分块更广。

具体来说,对于所进行的操作,按照某个点 \(B\) 划分,分为大于 \(B\) 及小于 \(B\) 两个部分,两部分使用不同的方式处理。(一般以根号为分界,即 \(B = \sqrt n\),因为这样复杂度最平衡)

简而言之,根号分治就是:对数据范围分块处理,将多个暴力算法“拼接在一起”,实现优化复杂度的作用。

算法思路

理论基础

具体思路如下:

  • 对于数据的种类少的部分,可以全部维护;
  • 对于另一部分,不方便维护的,可以暴力求解。

题目特征

  1. 能将原问题分为一个大问题(即前文说的 \(>\sqrt n\))和一个小问题(即前文说的 \(<\sqrt n\));
  2. 小问题的情况不多,可以维护所有可能的答案用离线算法求解;大问题可以用暴力求解;
  3. 题目中某个值的总数量一定:比如图论中所有点的度数之和为 \(m\),或字符串长度为 \(n\);
  4. 数据范围长得比较奇怪,比如 \(10^{10}\),既不像是筛法,又不像是什么数位 DP。

求解方法

因此,一般来说,根号分治的题目可以分为预处理阶段枚举阶段

  • 预处理阶段:通过不同的算法将分成的两块分别计算;
  • 枚举阶段:将两部分合并为一个结果,通常会用到数学知识。

具体步骤:

  1. 找到两种暴力算法,复杂度分别为 \(O(b)\) 和 \(O(n / b)\);
  2. 根据 \(n\) 的大小选取算法,则复杂度为:\(O(\min\{b, n / b\})\);
  3. 根据基本不等式,\(\min\{b, n / b\} \le n\);
  4. 取分界点 \(B = \sqrt n\),对分界点左、有分别选择较优的算法,复杂度降为 \(O(\sqrt n)\)。

应用

例题

题目:P3396 哈希冲突

题意:给定长为 \(n\) 的序列 \(\mathrm{value}\),和 \(m\) 个操作:

  • A x y:询问 \(\sum\mathrm{value}_i\space[i \bmod x = y]\);
  • C x y:修改 \(\mathrm{value}_x = y\)。
点击查看题解

考虑两种暴力解法:

  1. 预处理 模 \(i\) 为 \(j\) 的下标,其中的元素之和;时间复杂度:\(O(n^2) + O(m)\);
  2. 暴力求 每次询问都遍历 \(\mathrm ki + j \space (\mathrm k \in \mathbb Z^+)\);时间复杂度:\(O(mn)\)。

考虑优化,即将两种算法合并:

  1. 模数 \(< \sqrt n\):使用方法 \((1)\),时间复杂度:\(O(n \sqrt n) + O(m)\);
  2. 模数 \(> \sqrt n\):使用方法 \((2)\),时间复杂度:\(O(m \sqrt n)\);

因此,优化后的总时间复杂度为 \(O((n + m) \sqrt n)\)。

练习题

见:https://www.luogu.com.cn/training/386103

Reference

[1] https://blog.csdn.net/qq_35684989/article/details/127190872
[2] https://www.cnblogs.com/weixin2024/p/17032201.html
[3] https://www.luogu.com.cn/blog/Amateur-threshold/pu-li-mei-xue-qian-tan-gen-hao-fen-zhi
[4] https://zhuanlan.zhihu.com/p/594018645
[5] https://www.luogu.com.cn/blog/340940/gen-hao-fen-zhi-xue-xi-bi-ji
[6] https://www.cnblogs.com/ray52033/p/15011464.html
[7] https://www.luogu.com.cn/blog/blue/solution-p3396

标签:复杂度,分治,笔记,算法,sqrt,https,com,根号
From: https://www.cnblogs.com/RainPPR/p/sqrt-dc.html

相关文章

  • Git合并分支和复位笔记
    复位reset复位是把目前branch的版本复位到某个指点的版本。要复位branch到某个指定版本,要先到history里reset再Revertchange。这里不管是复位到旧版本还是新版本,由于和原来的不一致,都算被修改过,所以都要重新Revert掉。这里的reset就可以fetch远程库后进行更新,也可以reset旧......
  • MySQL 45讲笔记(2)
    全局锁和表锁根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类全局锁顾名思义,全局锁就是对整个数据库实例加锁。MySQL提供了一个加全局读锁的方法,命令是Flushtableswithreadlock(FTWRL)。当你需要让整个库处于只读状态的时候,可以使用这个命令,之后其他线......
  • k8s 安装笔记
    安装dockeryum-yinstallyum-utilsdevice-mapper-persistent-datalvm2yum-config-manager-y--add-repohttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repoyumlistdocker-ce--showduplicates|sort-ryuminstall-ydocker-ce-cli-23.0.6dock......
  • Python学习笔记
    一.简介1.概述文档仅是简单学习python,并不深入探究,保证能够正常使用。在进行python学习的时候,建议直接学习python3,不要在学python2,浪费时间。更详细学习,请参考:https://www.liaoxuefeng.com/wiki/10169596636024002.python优势简单,强大的库调用使得实现功能更加简单。中文,免......
  • SpringBoot笔记
    1.原理SpringApplication这个类主要做了以下四件事情:1、推断应用的类型是普通的项目还是Web项目2、查找并加载所有可用初始化器,设置到initializers属性中3、找出所有的应用程序监听器,设置到listeners属性中4、推断并设置main方法的定义类,找到运行的主类run方法剖析2.......
  • 线段树分治&可撤销并查集
    可撤销并查集按时间顺序用一个栈维护合并信息,撤销时从栈顶弹出合并信息,恢复原状态。并查集查找祖先时不能路径压缩,只能按秩合并。例题:[ABC302Ex]BallCollector容易想到将\(A_i\)和\(B_i\)之间连边。遍历整棵树,用可撤销并查集维护图。为了进一步求得答案,需要注意到该......
  • 学习Serilog日志笔记
       本学习笔记所有的.net 版本为6.0 首先引包nuget包为:serilog 和serilog.aspnetcore1、在控制台下使用日志:  需要引入Serilog.Sinks.Console包 然后在program.cs中写入以下语句:  Log.Logger=newLogerConfiguration().MinimumLevel.Debug()  .WriteT......
  • Uniapp学习笔记(vue3)
    https://uniapp.dcloud.net.cn/使用Vue.js开发所有前端应用的框架开发者编写一套代码,可发布到iOS、Android、Web(响应式)、以及各种小程序(微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝)、快应用等多个平台。周边生态丰富发送请求 methods:{ getMsg(msg){ ......
  • 《Unix/linux系统编程》教材第7、8章学习笔记
    第七章:文件操作文件操作级别(1)硬件级别fdisk:将硬盘、U盘或SDC盘分区mkfs:格式化磁盘分区,为系统做好准备fsck:检查和维修系统碎片整理:压缩文件系统中的文件(2)操作系统内核中的文件系统函数前缀为k表示内核函数(3)系统调用:用户模式程序使用系统调用来访问内核函数open()、read......
  • 学习笔记4
    第七章第八章自学笔记1.第七章7.1文件操作级别文件操作分为五个级别,按照从低到高的顺序排列如下。(1)硬件级别∶硬件级别的文件操作包括∶●fdisk∶将硬盘、U盘或SDC盘分区。●mkfs∶格式化磁盘分区,为系统做好准备。●fsck∶检查和维修系统。●碎片整理;压缩文件系统......