分块
作者:互联网
懒啊 引入老朋友博客
分块 根号n
分块,又被称为优雅的暴力,在想不出更优解,可以考虑分块来解决
将大小为n的数列分为根号n块,如果不能恰好分为根号n块的话,多分一块就可以了
修改
首先,我们预处理出每一个元素所属的块 kuai[i] 和每一块的总值 sum[i]
之后,在每次的区间修改时(单点修改也可以看做区间修改),必定会分出一部分块来
若区间两端点全在一个块内,直接暴力修改 a[i] 就可以了,同时将改区间的总值 sum[i] 做出改变;
若区间两端点不在一个块内,则必定出现整块,左碎块和右碎块(整块:即完整的块,左碎块:即包括左端点在内的小块,从左端点向右到第一个整块的左边界-1,右碎块:即包括右端点在内的小块,从右端点向左到第一个整块的右边界);
左右碎块的处理很简单,暴力修改就可以了,反正绝对不大于 2*根号n;
整块的处理就是块内的每个元素的值 a[i] 不做处理,直接对 sum[i] 动刀,即加上 修改值x*根号n;
再加一个 lazy[i] 数组,记录第i块内的元素整体做了哪些修改,即 lazy[i]+=x;
查询
仍是分出一部分块
若区间两端点在同一块里,暴力查询,每一个的值为 a[i]+lazy[kuai[i]]
若不在,仍分为左右碎块和整块
左右碎块暴力查询,每一个的值为 a[i]+lazy[kuai[i]]
对于整块,直接加上 sum[kuai[i]] ,
标签:分块,整块,修改,kuai,根号,碎块 来源: https://www.cnblogs.com/yfmd/p/15578517.html