懒啊 引入老朋友博客
分块 根号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
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。