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

critnos
咔菲好喝。搬运于
2025-08-24 23:02:09,当前版本为作者最后更新于2024-04-05 19:11:54,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
首先把值域按照 分块。
然后从小到大扫描每个块,如果这个块中有 个数在区间中就停下来,记这个块是 。
首先可知,存在一个方案是这个块内前三小值的和。这就说明,其他的方案至少包含一个 的块中的数。
接下来考虑所有 的块中的数,只有 个。
如果答案包含这其中的 个数,这个是容易计算的。可以发现,答案的最大、次大值在排序数组中相邻。那么只需要取出 的块中的数和块 中的最小值计算这些数的答案。
对于已经排序的数组,可以线性计算答案。小到大枚举合法的 的时候,只有 的前缀最小值才是有用的,可以双指针。
接下来考虑包含一个 的数,和两个 的数。
而且可以发现,一个最小值( 的数)要能有用,必须满足区间包含了这块中的不超过 个数。那么我们枚举最小值,对应的区间总长度是 的。
算法 1
这是暴力。
显然这两个数只能在块 和 中,不妨判掉一个在 一个在 中的情况。然后需要解决的就是最大值和次大值同块的情形。
可以发现,如是在做这样一个事情:找到一个最小的 ,使得区间中存在两个数 ,满足 。
那么把块中的数排序,从小到大加入。类似区间最近点对,考虑加入一个 带来的有贡献的对子,不妨设 ,如果 和 都有贡献,那么 。那么加入一个 会带来 个新对子。找这个对子可以 线段树二分。
然后枚举最小值,找到这个最小值区间中的对子,可以发现这样找到了 个支配三元组。
然后用迭代分块进行二维数点。时间复杂度 ,常数较小。
算法 2
可以证明,支配三元组数量是 的(proved by ZhouKangyang):
记枚举的最小值是 ,考虑这个最小值的区间,记 ,那么如果 ,那么 必然是合法三角形。那么对于每类 ,相当于最小化区间 ,这非常经典,直接单调栈求出即可。另一类情况是 ,那么只需要对每个 求出其前面和后面第一个 (显然如果有 使得 那么 更优)。
所以,支配三元组数正比于区间长度。
那么时间复杂度为 (利用 veb 数点并 求支配三元组可以更优,找支配三元组精细实现可以不用 hash),非常接近区间最近点对。常数较大。
十分遗憾地,根据我的实现,两种做法均可通过,但算法 1 的运行速度更快。
- 1
信息
- ID
- 10035
- 时间
- 4000ms
- 内存
- 2048MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者