1 条题解
-
0
自动搬运
来自洛谷,原作者为

mrsrz
故障机器人搬运于
2025-08-24 22:26:52,当前版本为作者最后更新于2021-01-04 17:13:36,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
已成为常见的根号复杂度范围.jpg
本题可以分为两个部分,下面分别对其分析。
-
第一部分(预处理)
我们对每个不同的数值进行考虑。考虑当前的数为 ,它的出现次数为 。
由于 能产生贡献的区间的中点位置必须是 ,因此我们考虑枚举两个端点到中点的距离 。 在区间的出现次数显然随着 的增大而单调不降,且出现次数为 。
我们再对 的每个不同的出现次数进行考虑。对于 出现了 次,它对应的 是连续的,设为区间 。我们可以找到一个 满足当 时, 是区间的众数,而当 时, 不是区间的众数。证明很简单,这里略去。
因此我们可以使用二分来找到这个 的值,从而能得出所有能产生贡献的 的范围。由于总共有 个不同的出现次数( 次不可能成为众数,故略去),因此可以得到 个互不相交的范围。
由于二分的时候还需要求区间众数,因此对于一个 ,求它的 的范围需要 或 的时间复杂度。而所有的 的 的和为 ,因此这部分的总时间复杂度为 或 。这个复杂度还不能接受。
考虑优化上述过程。
容易发现, 的不同的 最多有 个,这部分我们可以暴力枚举 并进行判断,时间复杂度 (记得把连续的 并成一个区间,否则空间复杂度将为 )。
而对于 的所有 ,我们不妨考虑枚举众数的出现次数。
假设当前众数的出现次数为 ,我们可以在 内求出 ,其中 表示最小的满足 的区间众数出现次数为 的 。
以下是求数组 的方法:
可以证明 是区间 的唯一众数,否则 的众数的出现次数也为 。
同理,若 ,则 的众数的出现次数也为 。
我们对一个 的左端点不断按此法向右移动,得到的 会满足 ,即 是位置 之后第 个 。
考虑令 表示 之后第 个 的出现位置,那么对于一个 ,就有 。
也就是说 是 的后缀 数组。
用 vector 按顺序存每个数值的出现位置,然后再对每个位置记一下它在 vector 里的下标,就可以 得到单个 。
那么这部分的时间复杂度为 。
枚举可能的数值 ,并取出 满足当且仅当 时, 的出现次数恰好为 。
我们在上面提到了二分这个 ,在二分的时候,我们需要判断的其实是,是否存在一个区间 满足 的区间众数大于等于 。而我们只需要对所有的 检查:满足 的众数出现次数恰好为 的最小的 是否大于 ,这个 就是上面我们求出的 。而由于 具有单调性,因此我们只需要检查 是否大于 即可。因此单次检验是 的,一次二分的复杂度就是 。
由于所有的 的 总和为 ,因此这里的二分的次数不会超过 次,时间复杂度为 。
而我们需要对每个 计算对应的 数组,因此这部分的时间复杂度是 。
-
第二部分(回答询问)。
我们接下来需要解决的问题如下:
给定不超过 个三元组 满足 。对每个三元组,枚举 ,并令 增加 。
次询问,每次给定 ,求 的值。
这个问题有多种做法,这里介绍一种较方便且容易理解的做法(感谢 memset0 提供了该做法的思路)。
上面这个二维的问题是比较容易想到的转化后的题意,不过我们还是直接讨论一个三元组 对 的贡献。
令 为 的长度, 为 的长度,则贡献为 。
令 ,可以发现,当 时,总有 ,当 时,总有 。
那么我们对 和 两种情况分开统计贡献即可。每种情况都是一个简单的二维数点问题,使用离线树状数组解决即可,时间复杂度 ,空间复杂度 。
综上,算法的时间复杂度为 ,空间复杂度为 ,可以通过本题。
-
- 1
信息
- ID
- 5862
- 时间
- 2500ms
- 内存
- 128MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者