ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

数列分块入门 1-9

2022-02-27 12:04:49  阅读:166  来源: 互联网

标签:lceil frac 入门 分块 散块 复杂度 sqrt rceil 数列


来自 hzwer 的九道非常经典的分块题。

目前可以在 LOJ 上提交:Here


1.

给出一个长度为 \(n\) 的数列,支持区间加,单点查值。

将序列分成长度为 \(S\) 的 \(\lceil\frac{n}{S}\rceil\) 块。

设我们的操作区间为 \([l,r]\),称被其完全包含的块为整块,否则为散块。

可以发现整块的数量不超过 \(\lceil\frac{n}{S}\rceil\),散块的数量不超过 \(2\),于是散块中元素的个数不超过 \(2S\)。

加法操作就可以在这 \(\lceil\frac{n}{S}\rceil\) 个整块上打标记,散块中的元素暴力加。

一次操作的时间复杂度为 \(O(\lceil\frac{n}{S}\rceil+S)\)。

单点查询就直接输出该位置的值加上所在块的标记,复杂度是 \(O(1)\) 的。

注意到我们需要平衡修改操作的复杂度,即让 \(\lceil\frac{n}{S}\rceil\) 和 \(S\) 尽量差的小。

于是取 \(S=\sqrt n\) 就可以做到 \(O(\sqrt n)\)。

总时间复杂度 \(O(n\sqrt n)\)。


2.

给出一个长度为 \(n\) 的数列,支持区间加,求一个区间中小于一个数 \(x\) 的元素数量。

可以考虑在每个块内维护原序列排序后的序列。也就是每个块维护一个原块,和一个排序后的块。

那么对于一个块的询问就可以 \(O(\log S)\) 二分一下完成。

散块暴力统计,时间复杂度 \(O(S)\)。

那么一次询问的复杂度为 \(O(\lceil\frac{n}{S}\rceil\log S+S)\)。

对于修改操作,可以发现对于一个整块进行整体加法并不会改变其有序性。所以可以直接在 \(\lceil\frac{n}{S}\rceil\) 个整块上打加法标记,复杂度 \(O(\lceil\frac{n}{S}\rceil)\)。

散块暴力做加法,同时重新排序,时间复杂度 \(O(S+S\log S)\)。

于是一次修改的复杂度为 \(O(\lceil\frac{n}{S}\rceil+S\log S)\)。

取 \(S=\sqrt n\) 可以做到 \(O(\sqrt n\log n)\)。

标签:lceil,frac,入门,分块,散块,复杂度,sqrt,rceil,数列
来源: https://www.cnblogs.com/yukari1735/p/15941861.html

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

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有