首页 > 其他分享 >根号分治学习笔记

根号分治学习笔记

时间:2023-10-25 16:24:36浏览次数:42  
标签:前缀 复杂度 分治 笔记 查询 sqrt mathcal 根号

根号分治的核心思想是平衡。

板子题。很容易想到两种暴力:一是不做预处理,每次询问暴力查询,这样复杂度是 \(\mathcal O(q\times \dfrac{n}{p})\)。二是预处理每个池子的值,每次 \(\mathcal O(1)\) 查询,复杂度为 \(\mathcal O(np)\)。

观察两个式子,由于 \(q,n\) 同阶,结合以下两种算法,发现可以平衡一下 \(p\) 的取值,只预处理 \(p\leq \sqrt n\) 的 \(p\) 的每个池子的取值,复杂度 \(\mathcal O(n\sqrt n)\)。当 \(p>\sqrt n\) 时,暴力跳复杂度也是对的 \(\mathcal O(q\sqrt n)\)。

namespace WrongAnswer_90
{
	int n,m,bl,a[150001],b[401][401];
	void mian()
	{
		read(n,m),bl=sqrt(n);int x,y;char ch;
		for(int i=1;i<=n;++i)
		{
			read(a[i]);
			for(int p=1;p<=bl;++p)b[p][i%p]+=a[i];
		}
		for(int i=1;i<=m;++i)
		{
			cin>>ch;read(x,y);
			if(ch=='A')
			{
				if(x<=bl)write(b[x][y],'\n');
				else
				{
					int s=0;
					for(int i=y;i<=n;i+=x)s+=a[i];
					write(s,'\n');
				}
			}
			else
			{
				for(int p=1;p<=bl;++p)b[p][x%p]+=y-a[x];
				a[x]=y;
			}
		}
	}
}

就这样,通过对某个值的取值的分类讨论,并恰当的划分分界点我们就得到了一个相对优秀的算法。

板子题*2 还是类似的板子题,只不过空间存不下。用到一个神奇 trick:对于相同的 \(p\) 离线处理,这样时间复杂度不变,空间也是线性的。

CF587F Duff is Mad

一道类似又不类似的题CF547E Mike and Friends,由于是多串匹配,还是考虑建立 ACAM。

发现信息有可减性,直接离线差分,把询问挂在序列上,问题变为查询 \([1,r]\) 中是 \(s_k\) 子串的串的个数。

经典结论:1. 子串是一个串的前缀的后缀。2. fail 树上祖先是后代的后缀。

所以查询即对于每一个前缀查询 \([1,r]\) 中有多少个串是它的后缀,把 \([1,k]\) 区间的所有串结尾位置的权值设成 \(1\),这也等价于在 fail 树上查所有前缀代表的节点到根的链的权值之和。单点加,根链查值,可以转为区间(子树)加,单点查值。

但是这样复杂度是假的,树状数组维护的话是 \(\mathcal O(n\log m+\sum s_k \log m)\),用根号加,\(\mathcal O(1)\) 查的值域分块平衡一下可以做到 \(\mathcal O(n\sqrt m+\sum s_k)\)。

注意其中后半部分是查询的所有 \(s_k\) 串的长度之和,这个东西的大小是没有保证的。观察一下,发现复杂度退化的原因是可能对一个很长的串多次以他为 \(s_k\),每次都要扫一遍它的所有前缀。

这启发我们对于串的长度大小分治:对于 \(length\leq B\) 的串像上面一样暴力查,复杂度是 \(\mathcal O(n\sqrt m+qB)\)。

对于长度大于 \(B\) 的串,数量不会超过 \(\dfrac{m}{B}\) 个。对于每个串分别处理。假设当前处理的是 \(s_k\),我们考虑每个串对这个串的贡献,即查每个串在这个串中的出现次数。这个是好做的,还是用到上面的经典结论:对于 \(s_k\) 的每个后缀的节点,权值设成 \(1\),这样一个串 \(s_i\) 在 \(s_k\) 中的出现次数就是 \(s_i\) 结尾的子树中的权值和,\(\mathcal O(n)\) 扫一遍,然后做一下前缀和。这样总复杂度是 \(\mathcal O(n\sqrt m+qB+n\times \dfrac{m}{B})\),因为 \(n,m,q\) 同阶,所以当 \(B\) 取 \(\sqrt n\) 时复杂度为 \(\mathcal O(n\sqrt n)\)。

P5901 [IOI2009] Regions 做完再写

标签:前缀,复杂度,分治,笔记,查询,sqrt,mathcal,根号
From: https://www.cnblogs.com/WrongAnswer90-home/p/17787483.html

相关文章

  • 《流畅的Python》 读书笔记 第5章 一等函数 20231025
    第5章一等函数第四章相对偏僻,但时间上一样要花我很久,就先跳过了,回头再补。而这个第5章节是非常重要的。只是最近工作有点忙,我读的越来越慢了~继续坚持吧。在Python中,所有函数都是一等对象,整数、字符串和字典都是一等对象(注:first-classobject)要成为一等对象,需要满足......
  • Hive学习笔记:nvl和coalesce函数的区别
    nvl函数和coalesce函数都是用来处理空值的函数,但略有不同。注意:非NULL值为NULL,如果是'','','null','NULL'等视为字符串,返回参数本身。一、nvl函数nvl只能处理2个参数,如果第1个不是null,则返回第1个参数,否则返回第2个参数。selectnvl(1,2);--1selectnvl(1,n......
  • Linux笔记(3)
    ACL权限的管理用户权限管理始终是Unix系统管理中最重要的环节。大家对Linux/Unix的UGO权限管理方式一定不陌生,还有最常用的 chmod 命令。为了实现一些比较复杂的权限管理,往往不得不创建很多的组,并加以详细的记录和区分(很多时候就是管理员的噩梦)。可以针对某一个用户对......
  • CSAPP 第二章 笔记
    信息存储十六进制表示法0x开头字数据大小寻址和字节顺序大端法/小端法布尔代数C中逻辑运算C中移位运算右移(算数/逻辑)整数表示无符号数编码补码编码各种转换有无符号数之间的转换不同字长整数之间的转换小->大无符号数:补零有符号数:补符号位......
  • bilibili B站:从零开始学Makefile - 原作者笔记
    视频摘自B站:https://www.bilibili.com/video/BV1Bv4y1J7QT笔记摘自:https://gitee.com/yanmu_ym/cpp学习环境搭建Linux(以Ubuntu为例)sudoaptinstallgccg++makeWindows学习与演示过程以Windows为主,Windows上装MinGW环境,MinGW官网:https://www.mingw-w64.org/之前我们提过两个版......
  • 华为云耀云服务器L实例:高级篇-部署自己的memos云端笔记
     华为云耀云服务器L实例是一款可快速部署且易于运维的轻量级云服务器,专为中小企业和入门级开发者打造。它不仅拥有华为云擎天架构的强大性能,还具有多项用户体验优化方案,让用户轻松上手,享受简单上云的乐趣。本产品网址为:https://www.huaweicloud.com/product/hecs-light.html......
  • 【图形学笔记】Lecture02&03 光栅化、抗锯齿、Z-buffer
    目录Lecture02-DigitalDrawing数码绘画Triangles-FundamentalAreaPrimitive三角形——基本区域Rasterization光栅化Sampling采样Lecture03-Sampling,Aliasing,Antialiasing采样、锯齿、抗锯齿Artifactsduetosampling-“Aliasing”采样产生的问题-混叠Antialias......
  • bilibili B站:【文档向】CMake基础知识 - 原作者笔记Markdown风格
    视频摘自B站:https://www.bilibili.com/video/BV1hz4y1H7YA笔记摘自:https://gitee.com/yanmu_ym/cpp[TOC]#预备知识##CMake是什么CMake是一个管理代码构建的工具。与平台和构建系统无关。最初CMake只用于生成不同版本的Makefile。现在CMake可以生成不同构建工具构建文件,也可......
  • bilibili B站:【文档向】CMake基础知识 - 原作者笔记
    视频摘自B站:https://www.bilibili.com/video/BV1hz4y1H7YA笔记摘自:https://gitee.com/yanmu_ym/cpp目录预备知识CMake是什么环境搭建与学习准备前置条件Ubuntu安装CMakeWindows安装CMake学习材料CMakeTutorial第一步起点练习1最简单的CMake项目练习2指定C++标准练习3添加版本......
  • bilibili B站:从零开始学Makefile - 原作者笔记Markdown风格
    视频摘自B站:https://www.bilibili.com/video/BV1Bv4y1J7QT笔记摘自:https://gitee.com/yanmu_ym/cpp#学习环境搭建###Linux(以Ubuntu为例)```shellsudoaptinstallgccg++make```###Windows学习与演示过程以Windows为主,Windows上装MinGW环境,MinGW官网:https://www.min......