1 条题解
-
0
解题思路
思路
本题的操作全部是静态区间最大值询问。随着数据规模增大,可以依次采用逐询问扫描、分块预处理和 ST 表,把单次询问复杂度从线性降低到平方根,最终降低到常数。
做法
子任务 1:直接扫描询问区间
对每次询问,从左端点走到右端点并维护当前最大值即可。该方法无需预处理,单次询问的时间复杂度为 ,总时间复杂度为 ,适用于 。
子任务 2:分块
把数列按约为 的长度划分为若干块,并预处理每一块的最大值。
回答询问时,左右两端不足整块的部分逐项扫描,中间完整覆盖的块直接使用块最大值。一次询问至多扫描两个零散段和 个整块,因此总时间复杂度为 ,空间复杂度为 。这一做法可以处理 的子任务。
子任务 3:ST 表
记 为从位置 开始、长度为 的区间最大值。初始时 。对于 ,长度为 的区间可以拆成两个相邻、长度均为 的区间,因此其最大值由前一层的两个值取最大得到。
预处理所有层需要 时间和 空间。
对于询问 ,令 。区间两端各取一个长度为 的区间,这两个区间的并集覆盖整个询问区间。最大值运算满足幂等性,即重复覆盖同一位置不会改变结果,所以答案是这两个预处理值的最大值。
预先计算所有长度的整数对数后,每次询问只需 时间。总时间复杂度为 ,空间复杂度为 。
正确性证明
首先证明预处理值正确。对 归纳:当 时,区间只含一个元素,定义显然正确。若第 层均正确,则长度为 的区间由两个长度为 的相邻区间组成;取两者最大值正好得到整个区间最大值,因此第 层也正确。
再考虑任意询问 。按上述方式选择的左、右两个长度为 的区间都位于 内,并且它们的并集覆盖 。每个区间的最大值已由预处理正确求出;对二者再取最大值,就得到 中所有元素的最大值。由此算法对每次询问都输出正确答案。
复杂度
满分算法的预处理时间复杂度为 ,每次询问为 ,总时间复杂度为 ;空间复杂度为 。
数值范围
算法只比较输入整数,不进行加法或乘法。,使用 32 位有符号整数即可保存数组值和答案;下标、长度及询问数量也均在 32 位有符号整数范围内。
- 1
信息
- ID
- 952
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 0
- 上传者