分块入门 9题

本文介绍了分块技术在处理长数列时的优化方法,通过9道例题详细讲解了如何应用分块解决区间加法、查询、乘法、开方等操作,包括不完整块的处理、块内有序化、维护块信息以及动态重构等策略,同时提供了一些分块进阶练习题。
摘要由CSDN通过智能技术生成

分块的9题是跟着黄学长的博客写的,算是真正的入门了吧。
例题1:给出一个长为n的数列,以及n个操作,操作涉及区间加法,单点查值。
题解By hzwer:
这是一道能用许多数据结构优化的经典题,可以用于不同数据结构训练。数列分块就是把数列中每m个元素打包起来,达到优化算法的目的。以此题为例,如果我们把每m个元素分为一块,共有n/m块,每次区间加的操作会涉及O(n/m)个整块,以及区间两侧两个不完整的块中至多2m个元素。我们给每个块设置一个加法标记(就是记录这个块中元素一起加了多少),每次操作对每个整块直接O(1)标记,而不完整的块由于元素比较少,暴力修改元素的值。每次询问时返回元素的值加上其所在块的加法标记。这样每次操作的复杂度是O(n/m)+O(m),根据均值不等式,当m取√n时总复杂度最低,为了方便,我们都默认下文的分块大小为√n。
作为第一题,理解了分块的分发和基本的处理方法。
分块的方式有两种

  1. 块大小?固定(对于所有?都相同),取一个在sqrt(maxn)附近的值;
  2. 块大小?不固定,对于每个?取sqrt(n)。
    第二种写法暂时没写过,习惯写第一种。
    块的左端点 (bl[x]-1)*blo+1 右端点 bl[x]*blo
    一般分成三种类型 [l,L) [L,R] (R,r]
#include<bits/stdc++.h>
#define ll long long 
 using namespace std;
const int MAXN=50006;
int n,blo,a[MAXN],bl[MAXN],atag[MAXN];
void add(int l,int r,int c)
{
   
   for(int i=l;i<=min(bl[l]*blo,r);i++)  a[i]+=c;
   if(bl[l]!=bl[r])
    for(int i=(bl[r]-1)*blo+1;i<=r;i++) a[i]+=c;
   for(int i=bl[l]+1;i<=bl[r]-1;i++)
    atag[i]+=c;
}
int get(int x) {
   return a[x]+atag[bl[x]];}
int main()
{
   
    freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	cin>>n;  blo=sqrt(n);
    for(int i=1;i<=n;i++)
	{
   
	   scanf("%d",&a[i]);
	   bl[i]=(i-1)/blo+1;
	}
	int opt,l,r,c;
	for(int i=1;i<=n;i++)
	{
   
	  scanf("%d%d%d%d",&opt,&l,&r,&c);
	  if(opt==0) add(l,r,c);
	  if(opt==1) printf("%d\n",get(r));
	}
	return 0;
}

例题2:给出一个长为n的数列,以及n个操作,操作涉及区间加法,询问区间内小于某个值x的元素个数。
题解:有了上一题的经验,我们可以发现,数列简单分块问题实际上有三项东西要我们思考:

对于每次区间操作:
1.不完整的块 的O(√n)个元素怎么处理?
2.O(√n)个 整块 怎么处理?
3.要预处理什么信息(复杂度不能超过后面的操作)?

我们先来思考只有询问操作的情况,不完整的块枚举统计即可;而要在每个整块内寻找小于一个值的元素数,于是我们不得不要求块内元素是有序的,这样就能使用二分法对块内查询,需要预处理时每块做一遍排序,复杂度O(nlogn),每次查询在√n个块内二分,以及暴力2√n个元素,总复杂度O(nlogn + n√nlog√n)。
第二题 有一个lower_bound() 的操作。
lower_bound和upper_bound其实就相当于是一个二分,在一个非递减序列中,可以O(logn)求出给出的数在序列中的位置。
分块的不完整区间的操作。

#include<bits/stdc++.h>
#define ll long long 
 using namespace std;
const int MAXN=50006;
int n,blo,a[MAXN],bl[MAXN],atag[MAXN];
vector< int > v[1000];
void rebuild(int x)
{
   
  v[x].clear();
  for(int i=(x-1)*blo+1;i<=min(n,x*blo);i++)
   v[x].push_back(a[i]);
  sort(v[x].begin(),v[x].end());
}
void add(int l,int r,int c)
{
   
   for(int i=l;i<=min(bl[l]*blo,r);i++)  a[i]+=c;
   rebuild(bl[l]);
   if(bl[l]!=bl[r])
    {
   
      for(int i=(bl[r]-1)*blo+1;i<=r;i++) a[i]+=c;
      rebuild(bl[r]);
	}
   for(int i=bl[l]+1;i<=bl[r]-1;i++)
    atag[i]+=c;
}
int get(int l,int r,int c)
{
   
   int J=0;
   for(int i=l;i<=min(bl[l]*blo,r);i++) 
    if(a[i]+atag[bl[i]]<c) J++;
   if(bl[l]!=bl[r])
    for(int i=(bl[r]-1)*blo+1;i<=r;i++)	
     if(a[i]+atag[bl[i]]<c) J++;
   for(int i=bl[l]+1;i<=bl[r]-1;i++)
   {
   
   	 int C=c-atag[i];
   	 J+=lower_bound(v[i].begin(),v[i].end(),C)-v[i].begin();
   }
   return J;
}
int main()
{
   
    freopen("a.in","r",stdin);
	freopen("a.out","w",stdout);
	cin>>n;  blo=sqrt(n);
    for(int i=1;i<=n;i++)
	{
   
	   scanf("%d",&a[i]);
	   bl[i]=(i-1)/blo+1;
	   v[bl[i]].push_back(a[i]);
	   
	}
	for(int i=1;i<=bl[n];i++)  sort(v[i].begin(),v[i].end());
	int opt,l,r,c;
	for(int i=1;i<=n;i++)
	{
   
	  scanf("%d%d%d%d",&opt,&l,&r,&c);
	  if(opt==0) add(l,r,c);
	  if(opt==1) printf("%d\n",get(l,r,c*c));
	}
	return 0;
}

例题3:给出一个长为n的数列,以及n个操作,操作涉及区间加法,询问区间内小于某个值x的前驱(比其小的最大元素)。
题解:接着第二题的解法,其实只要把块内查询的二分稍作修改即可。
不过这题其实想表达:可以在块内维护其它结构使其更具有拓展性,比如放一个 set ,这样如果还有插入、删除元素的操作,会更加的方便。
分块调试技巧:可以生成一些大数据,然后用两份分块大小不同的代码来对拍,还可以根据运行时间尝试调整分块大小,减小常数。
其实写分块的时候顺带写了暴力,只要把块的大小改为1,两个代码对拍即可。

#include<bits/stdc++.h>
#define ll long long 
 using namespace std;
const int MAXN=500050;
int n,blo,a[MAXN],bl[MAXN],atag[MAXN];
vector< int > v[10000];
void rebuild(
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
智慧校园整体解决方案是响应国家教育信息化政策,结合教育改革和技术创新的产物。该方案以物联网、大数据、人工智能和移动互联技术为基础,旨在打造一个安全、高效、互动且环保的教育环境。方案强调从数字化校园向智慧校园的转变,通过自动数据采集、智能分析和按需服务,实现校园业务的智能化管理。 方案的总体设计原则包括应用至上、分层设计和互联互通,确保系统能够满足不同用户角色的需求,并实现数据和资源的整合与共享。框架设计涵盖了校园安全、管理、教学、环境等多个方面,构建了一个全面的校园应用生态系统。这包括智慧安全系统、校园身份识别、智能排课及选课系统、智慧学习系统、精品录播教室方案等,以支持个性化学习和教学评估。 建设内容突出了智慧安全和智慧管理的重要性。智慧安全管理通过分布式录播系统和紧急预案一键启动功能,增强校园安全预警和事件响应能力。智慧管理系统则利用物联网技术,实现人员和设备的智能管理,提高校园运营效率。 智慧教学部分,方案提供了智慧学习系统和精品录播教室方案,支持专业级学习硬件和智能化网络管理,促进个性化学习和教学资源的高效利用。同时,教学质量评估中心和资源应用平台的建设,旨在提升教学评估的科学性和教育资源的共享性。 智慧环境建设则侧重于基于物联网的设备管理,通过智慧教室管理系统实现教室环境的智能控制和能效管理,打造绿色、节能的校园环境。电子班牌和校园信息发布系统的建设,将作为智慧校园的核心和入口,提供教务、一卡通、图书馆等系统的集成信息。 总体而言,智慧校园整体解决方案通过集成先进技术,不仅提升了校园的信息化水平,而且优化了教学和管理流程,为学生、教师和家长提供了更加便捷、个性化的教育体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值