首页 > 其他分享 >学习笔记:分块

学习笔记:分块

时间:2023-08-28 16:00:29浏览次数:46  
标签:bel 分块 int rs sqrt 学习 笔记 block ls

前言

非常粗略

概念

什么是分块算法?
很简单 就是暴力 把一段长度为 \(n\) 的序列 分成 \(\sqrt{n}\) 块 块长为 \(\sqrt n\) 然后进行一系列暴力乱搞
它的好处就是非常暴力 好!
先来看一道 板子

题目要求我们区间加一个数 区间查询一段和
这个东西怎么搞?
考虑分块!
首先呢 把原数列分为了 \(\sqrt n\) 块 可能末尾还会多一块不足 \(\sqrt n\) 长度的块
然后 我们需要预处理以下的值:

  • \(bel_x\) 查询每个数在哪个块
  • \(L_x\) 这个块的左端点
  • \(R_x\) 这个块的右端点
  • \(block\) 块长
  • \(tot\) 块数
    注意处理最后一块的边界和块数即可

易得每一块的左端点为 \((i-1)\times block +1\) 右端点为 \(i\times block\)
根据这样算一下即可

void build()
{
	block=sqrt(n);
	tot=n/block;
	if(n%block) tot++;
	for(int i=1;i<=tot;i++)
		L[i]=R[i-1]+1,R[i]=i*block;
	R[tot]=n;
	for(int i=1;i<=n;i++)
		bel[i]=(i-1)/block+1,sum[bel[i]]+=a[i];
}

预处理完毕 思考怎么修改/求中间一段
其实很简单

  • 对于中间的整段 借用线段树的思想 打个 \(tag\) 走路即可 不超过 \(O(\sqrt n)\)
  • 对于左右的零散段 暴力改即可 不超过 \(O(\sqrt n)\)

时间复杂度 \(O(\sqrt n)\)
注意特判在一个块内的即可

void updata(int l,int r,ll x)
{
	int ls=bel[l],rs=bel[r];
	if(ls==rs)
	{
		for(int i=l;i<=r;i++)
			a[i]+=x,sum[ls]+=x;
		return ;
	}
	for(int i=l;i<=R[ls];i++)
		a[i]+=x,sum[ls]+=x;
	for(int i=L[rs];i<=r;i++)
		a[i]+=x,sum[rs]+=x;
	for(int i=ls+1;i<=rs-1;i++)
		tag[i]+=x,sum[i]+=(R[i]-L[i]+1)*x;
	return ;
}

然后是查询
借用和修改一样的操作就行 时间复杂度 \(O(\sqrt n)\)

ll query(int l,int r)
{
	int ls=bel[l],rs=bel[r];
	ll ans=0;
	if(ls==rs)
	{
		for(int i=l;i<=r;i++)
			ans+=a[i]+tag[ls];
		return ans;
	}
	for(int i=l;i<=R[ls];i++)
		ans+=a[i]+tag[ls];
	for(int i=L[rs];i<=r;i++)
		ans+=a[i]+tag[rs];
	for(int i=ls+1;i<=rs-1;i++)
		ans+=sum[i];
	return ans;
}

这样 我们优雅的暴力程序就出来了 时间复杂度 \(O(n\sqrt n)\) 还是很不错的

标签:bel,分块,int,rs,sqrt,学习,笔记,block,ls
From: https://www.cnblogs.com/g1ove/p/17662532.html

相关文章

  • 学习笔记414—Sigmoid函数求导
    Sigmoid函数求导基础知识: Sigmoid函数: Sigmoid图形: 生成Sigmoid图形代码:importtorchfromd2limporttorchasd2l%matplotlibinlinex=torch.arange(-8.0,8.0,0.1,requires_grad=True)sigmoid=torch.nn.Sigmoid()y=sigmoid(x)d2l.plot(x.detach(),y.detach(......
  • 学习mybatis连接
    1.在pom中添加mybatis,Junit依赖,以及MySQL数据库驱动在配置文件夹创建xml文件,默认名称为mybatis-config.xml在xml中配置数据库连接环境,官方文档有模板<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEconfigurationPUBLIC"-//mybatis.org//DTDConfig3.0//EN"......
  • MAUI学习之始--数据绑定,命令绑定 MVVM
    MVVMMVVM(model-view-view-model)模型之前在刚开始学Xamarin的时候,都是把页面的的表示文件(.xaml)和页面中的命令写在一起。一开始只有一两个页面还好,因为每个页面之间的联系都不是特别多,我们还能看得过来。修改的时候也还好,就想改哪里点哪里。但是奥!但是!当我们页面......
  • [计算机学习]PWN 入门启程
    2023年8月10日开通开通了ctf.show的PWN入门课程。之前是去年打ctf比赛,买过VIP。题目很多,挺适合新手入门,如果你也要学习打CTF,建议可以买一个VIP会员,题目很多,可以一关一关自己练习。如果纯萌新,也可以买一个私教课程。2023年8月28日第一次写writeupPWN0使用MobaXterm.exe连接题......
  • WebService开发笔记 1 -- 利用cxf开发WebService竟然如此简单
       现在的项目中需要用到SOA概念的地方越来越多,最近我接手的一个项目中就提出了这样的业务要求,需要在.net开发的客户端系统中访问java开发的web系统,这样的业务需求自然需要通过WebService进行信息数据的操作。下面就将我们在开发中摸索的一点经验教训总结以下,以供大家参考.......
  • WebService开发笔记 3 -- 增强访问 WebService 的安全性
    在WebService开发笔记1中我们创建了一个WebService简单实例,下面我们通过一个简单的用户口令验证机制来加强一下WebService的安全性:1.修改WebService服务端spring配置文件ws-context.xml<beansxmlns="http://www.springframework.org/schema/beans" xmlns:xsi=......
  • WebService开发笔记 2 -- VS 2005 访问WebServcie更简单
    在上一回中我们创建了一个WebService服务(WebService开发笔记1--利用cxf开发WebService竟然如此简单),下面就来作一个跨平台访问WebServcie服务的例子....下面将在vs2005中通过c#.net访问我们创建好的WebService服务,C#.net第一次用,TNN的没想到这么简单,MS就是MS,不服不行。1.......
  • Struts2 v2.1.6 笔记
    1.启动<constantname="struts.devMode"value="true"/>或者<constantname="struts.configuration.xml.reload"value="true"/>时启动tomcat报错。org.apache.catalina.core.StandardContextfilterStart严重:Exceptionstarting......
  • 联邦学习中的安全多方计算
    联邦学习中的安全多方计算SecureMulti-partyComputationinFederatedLearning什么是安全多方计算安全多方计算就是许多参与方需要共同工作完成一个计算任务或者执行一个数学函数,每个参与方针对这个执行构建自己的数据或份额,但不想泄露自己的数据给其他参与方。在安全多方......
  • python+playwright 学习-77 playwright 发送接口请求APIRequestContext
    前言每个Playwright浏览器上下文都有与其关联的APIRequestContext实例,该实例与浏览器上下文共享cookie存储,可以通过browser_context.request或page.request访问。也可以通过调用api_request.new_context()手动创建一个新的APIRequest上下文实例。通过浏览器发请求可以通过browser......