根号分治(根号算法)

这篇具有很好参考价值的文章主要介绍了根号分治(根号算法)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

是根号算法,然而不是分块;

是论文,然而不是莫队;

是暴力美学,然而不是暴力。

例题

  • 哈希冲突
  • R e m a i n d e r P r o b l e m Remainder Problem RemainderProblem

这两题貌似没有区别,我们以 R e m a i n d e r P r o b l e m Remainder Problem RemainderProblem 作为例子来介绍。

题目描述

给你一个长度为 500000 500000 500000 的序列,初值为 0 0 0 ,你要完成 q q q 次操作,操作有如下两种:

  1. 1 x y : 将下标为 x x x 的位置的值加上 y y y
  2. 2 x y : 询问所有下标模 x x x 的结果为 y y y 的位置的值之和

思路

这道题要我们求的,就是以下程序:

for(int i=y;i<=n;i+=x)
    ans+=value[i];

但,这样暴力求解显然超时。

我们发现:

如果 x x x 很小时,那上面的那层 f o r for for 循环的复杂度更接近 O ( n ) O(n) O(n);反之,如果 x x x 很大时,复杂度反而会变小。

这样我们就有了一种思路,

x x x 比较大的时候我们才暴力,如果 x x x 很小,我们就直接记录答案!!!

这就是 根号分治 根号分治 根号分治 的思想,将询问根据数据大小分成两个部分,分别用不同的方法来做。

那分界线是多少呢?

一般规定,是 n \sqrt{n} n

即, x > n x > \sqrt{n} x>n 时,就暴力求解; x ≤ n x \le \sqrt{n} xn 时,则预处理出答案。

如此,当数据 ≤ n \le \sqrt{n} n 时,每次修改的时间复杂度为为 O ( n ) O(\sqrt{n}) O(n ) ,查询的为 O ( 1 ) O(1) O(1)

当数据 > n > \sqrt{n} >n 时,每次修改的时间复杂度为 O ( 1 ) O(1) O(1) ,查询的为 O ( n ) O(\sqrt{n}) O(n )

通过根号分治,我们就能实现两种操作的时间复杂度均分 。

对于预处理,我们用 f i , j f_{i,j} fi,j 表示所有下标模 i i i j j j 的数的和。

f f f 数组只需开到 n ∗ n \sqrt{n} * \sqrt{n} n n ,所以空间也不会爆。文章来源地址https://www.toymoban.com/news/detail-841839.html

代码

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+5,N=5e5,sqrtn=710;
int q;
long long a[maxn],f[sqrtn][sqrtn];
int main(){
	cin>>q;
	int opt,x,y,tmp=sqrt(N);
	while(q--){
		scanf("%d%d%d",&opt,&x,&y);
		if(opt==1){ //修改操作 
			for(int i=1;i<=tmp;i++)
				f[i][x%i]+=y;
			a[x]+=y;
		}
		else{ //查询操作 
			if(x<=tmp) printf("%lld\n",f[x][y]);
			else{
				long long ans=0;
				for(int i=y;i<=N;i+=x)
					ans+=a[i];
				printf("%lld\n",ans);
			}
		}
	}
	return 0;
}

注意

  • 其实在代码实现的过程中,修改操作并不能分类处理
  • 注意数组开的大小,是 n \sqrt{n} n ,以免出错,避免调试时难以发觉!

到了这里,关于根号分治(根号算法)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【学习笔记】数据结构算法文档(类C语言)

    1.1.1 线性表的顺序存储表示 1.1.2 顺序表中基本操作的实现 1.1.2.1 初始化 1.1.2.2 取值 1.1.2.3 查找 1.1.2.4 插入 1.1.2.5 删除 1.1.2.6 计数 1.2.1 单链表的定义和表示 ★ 关于结点 1.2.2 单链表基本操作的实现 1.2.2.1 初始化 1.2.2.2 取值 1.2.2.3 查找 1.2.2.4 插入 1.2.2.5 删除 1.2.2.6 前插法创建单

    2024年02月07日
    浏览(44)
  • 【软考程序员学习笔记】——数据结构与算法基础

    目录  🍊一、数据结构概念和分类 🍊二、数组特点存储方式 🍊三、矩阵 特殊矩阵 非特殊矩阵 🍊四、栈和队列 🍊 五、二叉树的性质 🍊六、二叉树的遍历 (1)前序遍历(先根遍历,先序遍历) (2)中遍历(中根遍历) (3)后序遍历(后根遍历,后序遍历) 🍊七、二叉排序树 🍊八、

    2024年02月12日
    浏览(62)
  • 数据结构学习笔记——图的遍历算法(深度优先搜索和广度优先搜索)

    图的遍历指从图中某一顶点出发(任意一个顶点都可以作为访问的起始顶点),按照某种遍历方法,对图中所有的顶点访问一次且只访问一次。图与树不一样,其中一个顶点可能与多个顶点相连,所以需记录已访问过的顶点,当访问一个顶点后,考虑如何选取下一个要访问的

    2024年02月05日
    浏览(53)
  • 数据结构与算法之美学习笔记:48 | B+树:MySQL数据库索引是如何实现的?

    本节课程思维导图: 作为一个软件开发工程师,你对数据库肯定再熟悉不过了。作为主流的数据存储系统,它在我们的业务开发中,有着举足轻重的地位。在工作中,为了加速数据库中数据的查找速度,我们常用的处理思路是,对表中数据创建索引。那你是否思考过,数据库

    2024年01月16日
    浏览(82)
  • 数据结构与算法之美学习笔记:42 | 动态规划实战:如何实现搜索引擎中的拼写纠错功能?

    本节课程思维导图: 利用 Trie 树,可以实现搜索引擎的提示功能,这样可以节省用户输入搜索的时间。实际上,搜索引擎在用户体验方面的优化还有很多,比如你可能经常会用的拼写纠错功能。 当你在搜索框中,一不小心输错单词时,搜索引擎会非常智能地检

    2024年02月03日
    浏览(61)
  • 数据结构--递归与分治

    汉诺塔分析: 以三层进行分析,大于三层分析情况是一样的。    八皇后问题:

    2024年02月11日
    浏览(33)
  • 数据结构与算法之美学习笔记:40 | 初识动态规划:如何巧妙解决“双十一”购物时的凑单问题?

    本节课程思维导图: 淘宝的“双十一”购物节有各种促销活动,比如“满 200 元减 50 元”。假设你女朋友的购物车中有 n 个(n100)想买的商品,她希望从里面选几个,在凑够满减条件的前提下,让选出来的商品价格总和最大程度地接近满减条件(200 元),这样就可以极大限

    2024年02月03日
    浏览(52)
  • 青岛大学_王卓老师【数据结构与算法】Week05_11_栈与递归_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周11–3.4栈和递归 递归的定义

    2024年02月16日
    浏览(49)
  • 青岛大学_王卓老师【数据结构与算法】Week05_06_栈的顺序表示_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周06–3.3栈的表示和实现2–3.

    2024年02月16日
    浏览(57)
  • 青岛大学_王卓老师【数据结构与算法】Week05_08_顺序栈的操作2_学习笔记

    本文是个人学习笔记,素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享, 另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权,请留言作删文处理。 课程视频链接: 数据结构与算法基础–第05周08–3.3栈的表示和实现4–3.

    2024年02月16日
    浏览(92)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包