#L4279. 「KTSC 2022 R2」安全系统
「KTSC 2022 R2」安全系统
注意事项
在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:
- C++(标准为 C++ 17 及以上)
请在提交源代码前添加 #include "security.h"。
题目描述
题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 2차 선발고사 T4 「보안 시스템」
KOI 国的机密设施可以表示为一个在坐标平面上的正方形,其左下角顶点为 ,右上角顶点为 ,边与坐标轴平行。正方形的每条边代表机密设施的墙壁。

在机密设施内有 个激光传感器,每个传感器从 到 编号。我们需要设计一个安全系统,通过这些激光传感器来检测入侵者。
每个激光传感器可以表示为坐标平面上的一个点。当激光传感器启动时,它会向上( 轴方向)、向右( 轴方向)、向下( 轴方向)或向左( 轴方向)发射激光。激光会一直延伸到碰到墙壁为止,因此激光的路径可以表示为从传感器位置到墙壁上的某个点的线段。
激光发射的方向用 到 的数字表示:
- 表示向上
- 表示向右
- 表示向下
- 表示向左

第 个激光传感器位于 ,启动时会向 方向发射激光。不同的激光传感器位于不同的位置。 和 是 到 之间的整数。
我们可以自由决定每个激光传感器是否启动。但如果不同的激光传感器发射的激光相遇,会导致检测错误,因此激光不能相交,包括端点。

第 个激光传感器的重要性为 ,表示启动该传感器对安全的贡献值。整个安全系统的安全级别是启动的激光传感器的重要性之和。
请编写一个函数,在确保激光不相交的前提下,决定哪些激光传感器启动,使得安全级别最大。
实现细节
你需要实现以下函数:
int max_level(vector<int> X, vector<int> Y, vector<int> D, vector<int> W);
- , , , :长度为 的整数数组。对于每个 ,第 个激光传感器的坐标为 ,启动时向 方向发射激光,重要性为 。
- 该函数返回在确保激光不相交的前提下,最大可能的安全级别。
注意,提交的代码中不应包含任何输入输出操作。
样例
考虑 , , , , 的情况。
评测程序将调用如下函数:
max_level({1, 2, 3, 4}, {1, 2, 3, 4}, {1, 1, 4, 4}, {1, 1, 1, 1});
下图展示了机密设施及其内部的传感器,以及传感器发射的激光。启动 号和 号传感器,或启动 号和 号传感器,激光不会相交,安全级别为 。没有比这更高的安全级别的方案。

因此,函数应返回 。
数据范围与提示
对于所有输入数据,满足:
- 对于所有 ,
- (对于所有 )
- 对于所有 ,
- 每个传感器的位置都不同
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| 1 | 5 | |
| 2 | 8 | |
| 3 | 21 | |
| 4 | 15 | |
| 5 | 11 | 对于所有 , |
| 6 | 17 | 对于所有 , 且 |
| 7 | 23 | 无附加限制 |
示例评测程序
示例评测程序的输入格式如下:
第 1 行:N
第 2+i (0 ≤ i ≤ N-1) 行:X[i] Y[i] D[i] W[i]
示例评测程序的输出格式如下:
第 1 行:max_level 函数返回的值
示例评测程序可能与实际评测程序不同。