博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
「分块系列」数列分块入门1 解题报告
阅读量:7180 次
发布时间:2019-06-29

本文共 1597 字,大约阅读时间需要 5 分钟。

题意概括

区间加法,单点求值。

写在前面

数列分块是个好东西。。。我这里详细介绍一下分块算法,便于初学者的理解(我这个蒟蒻原来也是看不懂分块)。

分块简要介绍

先把数组分成几个块块,然后就可以对它们整体操作啦。

也就是说,把一个长度为的数组,拆分成一个个长度为sqrt(n)小块(当然,最后一块可能不完整,但是不用管),记录每个数所属的块;也就是这样——(方便起见,我们直接再开一个数组来记录所属分块,虽然本题中可以临时计算,但在有些题目中这一步显得尤为重要)

scanf( "%d", &n );m = (int)sqrt(n);for ( int i = 1; i <= n; ++i ) p[i] = ( i - 1 ) / m + 1;for ( int i = 1; i <= n; ++i ) scanf( "%d", &a[i] );

然后,就可以瞎暴力辣!

实际上,所有的分块都是这样。把一个数列分成几块,然后对它们进行批量处理。一般来说,我们直接把块大小设为sqrt(n),但实际上,有时候我们要根据数据范围、具体复杂度来确定。

正题

当有修改时,对于完整的块,直接维护一个数组v记录整个块加过的数(每块共同的加数),不完整的就直接暴力在原数组a上直接加。询问时,直接输出原数组的值+所属块的共同加数即可。

代码

#include
#include
using namespace std;#define MAXN 50005int n, a[MAXN], p[MAXN], m, v[300];int opt, l, r, c;void Add( int l, int r, int c ){ if ( p[l] == p[r] ){//同属一分块时直接暴力即可 for ( int i = l; i <= r; ++i ) a[i] += c; return; } for ( int i = l; p[i] == p[l]; ++i ) a[i] += c;//对于两边不完整(即使完整也不管,看做不完整)的分块,直接暴力即可 for ( int i = r; p[i] == p[r]; --i ) a[i] += c; for ( int i = p[l] + 1; i <= p[r] - 1; ++i ) v[i] += c;//记录完整分块的共同加数}int main(){ scanf( "%d", &n ); m = (int)sqrt(n); for ( int i = 1; i <= n; ++i ) p[i] = ( i - 1 ) / m + 1;//记录所属分块 for ( int i = 1; i <= n; ++i ) scanf( "%d", &a[i] ); for ( int i = 1; i <= n; ++i ){ scanf( "%d%d%d%d", &opt, &l, &r, &c ); if ( opt == 0 ) Add( l, r, c ); else printf( "%d\n", v[p[r]] + a[r] );//所属分块共同加数+原数组的值 } return 0;}

总结

分块代码可以比线段树简洁不少,虽然暴力但十分巧妙,而且十分灵活,适用于更多的题目。

但是如果时间复杂度要求较高,分块的O(n sqrt(n))就不能承受了,所以还是要学会乖乖打线段树QAQ。

数列分块系列目录

<-

转载于:https://www.cnblogs.com/louhancheng/p/10051136.html

你可能感兴趣的文章
错误:Forefront TMG管理无法连接到配置存储服务器
查看>>
Java多线程——非原子64位操作(long,double)
查看>>
Maver使用外部的jar 包问题
查看>>
mySQL event
查看>>
jQuery子窗体如何取得父窗体的元素
查看>>
Office365 Exchange Hybrid No.06 ADFS场高可用部署
查看>>
Office365 Exchange Hybrid No.01 基础介绍
查看>>
Dsadd命令参数
查看>>
批量修改域客户端administrator密码以及更新密码框为灰色处理办法!
查看>>
Exchange 2010 批量删除特定关键字邮件
查看>>
使用MDT2012部署Windows&Linux操作系统(5)
查看>>
DNS
查看>>
我的友情链接
查看>>
grails 列出i18n内容
查看>>
学习 Dialplan 5.宏指令
查看>>
二叉树(层次遍历)非递归
查看>>
Go 生成图片
查看>>
命令-df/du
查看>>
整合 Tachyon 运行 Apache Flink(译)
查看>>
写给走在IT路上的我。。
查看>>