#3423. [IOI 2025] triples(Day1 T2)
[IOI 2025] triples(Day1 T2)
题目描述
东科迪勒拉山脉是安第斯山脉的一部分,横跨玻利维亚。它由一系列的 个山峰组成,编号从 到 。山峰 ()的高度为 ,是一个介于 到 (包含两端)之间的整数。
对于任意两个山峰 和 (其中 ),它们之间的距离定义为 。
根据古代印加传说,一组山峰的三元组是神秘的,如果它具有以下特殊性质:三个山峰的高度忽略顺序后与它们两两之间的距离匹配。
形式上,一组索引 是神秘的,如果:
- ,并且
- 高度 忽略顺序后与两两之间的距离 匹配。例如,对于索引 ,两两之间的距离为 ,所以高度 、 和 都与它们匹配,但高度 则不匹配。
本题由两部分组成,每个子任务分别与第一部分或第二部分相关。你可以按任意顺序解决这些子任务。特别地,你不需要完成第一部分的所有内容后再尝试第二部分。
第一部分
给定山脉的描述,你的任务是统计神秘三元组的数量。
实现细节
你需要实现以下函数:
long long count_triples(std::vector<int> H)
- :长度为 的数组,表示山峰的高度。
- 对于每个测试用例,该函数会被恰好调用一次。
该函数应返回一个整数 ,即山脉中神秘三元组的数量。
第二部分
你的任务是构造具有许多神秘三元组的山脉。这部分包含 6 个仅输出的子任务,采用部分计分方式。
在每个子任务中,会给你两个正整数 和 ,你需要构造一个山峰数量不超过 的山脉。如果你的解决方案包含至少 个神秘三元组,你将获得该子任务的满分。否则,你的得分将与你的解决方案中包含的神秘三元组数量成比例。
注意,你的解决方案必须是一个有效的山脉。具体来说,假设你的解决方案有 个山峰( 必须满足 )。那么,山峰 ()的高度 必须是一个介于 到 (包含两端)之间的整数。
实现细节
有两种提交解决方案的方式,对于每个子任务,你可以选择其中任意一种:
- 输出文件
- 函数调用
要通过输出文件提交解决方案,请创建并提交一个如下格式的文本文件:
N
H[0] H[1] ... H[N-1]
要通过函数调用提交解决方案,你需要实现以下函数:
std::vector<int> construct_range(int M, int K)
- :最大山峰数量。
- :期望的神秘三元组数量。
- 对于每个子任务,该函数会被恰好调用一次。
该函数应返回一个长度为 的数组 ,表示山峰的高度。
输入格式
第一部分和第二部分使用相同的样例评测程序,两部分的区别由输入的第一行决定。
第一部分的输入格式:
1
N
H[0] H[1] ... H[N-1]
第二部分的输入格式:
2
M K
输出格式
第一部分的输出格式:
T
第二部分的输出格式:
N
H[0] H[1] ... H[N-1]
注意,样例评测程序的输出与第二部分的输出文件格式一致。
输入输出样例 #1
输入 #1
1
7
4 1 4 3 2 6 1
输出 #1
3
说明/提示
第一部分示例
考虑以下调用:
count_triples([4, 1, 4, 3, 2, 6, 1])
该山脉中有 3 个神秘三元组:
- 对于 ,高度 与两两之间的距离 匹配。
- 对于 ,高度 与两两之间的距离 匹配。
- 对于 ,高度 与两两之间的距离 匹配。
因此,该函数应返回 。
注意,索引 不构成神秘三元组,因为高度 与两两之间的距离 不匹配。
第一部分约束
- 对于每个 (),。
子任务与计分
第一部分共 70 分。
| 子任务 | 分值 | 附加约束 |
|---|---|---|
| 1 | 8 | |
| 2 | 6 | 对于每个 (),。 |
| 3 | 10 | |
| 4 | 11 | 高度是非递减的。即对于每个 (),。 |
| 5 | 16 | |
| 6 | 19 | 无附加约束。 |
第二部分共 30 分。对于每个子任务, 和 的值是固定的,如下表所示:
| 子任务 | 分值 | ||
|---|---|---|---|
对于每个子任务,如果你的解决方案不是一个有效的山脉,你的得分将为 。
否则,设 为你的解决方案中神秘三元组的数量。那么,你在该子任务的得分是:
$$\begin{aligned} 5 \cdot \min \left(1, \frac{T}{K}\right) \end{aligned} $$