#HK4279. 「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);
X, Y, D, W:长度为 的整数数组。对于每个 ,第 个激光传感器的坐标为 ,启动时向 方向发射激光,重要性为 。- 该函数返回在确保激光不相交的前提下,最大可能的安全级别。
注意,提交的代码中不应包含任何输入输出操作。
样例
考虑 $N=4, X=[1,2,3,4], Y=[1,2,3,4], D=[1,1,4,4], W=[1,1,1,1]$ 的情况。 评测程序将调用如下函数:
max_level({1, 2, 3, 4}, {1, 2, 3, 4}, {1, 1, 4, 4}, {1, 1, 1, 1});
下图展示了机密设施及其内部的传感器,以及传感器发射的激光。启动 号和 号传感器,或启动 号和 号传感器,激光不会相交,安全级别为 。没有比这更高的安全级别的方案。

因此,函数应返回 2。
数据范围与提示
对于所有输入数据,满足:
- 对于所有 ,
- (对于所有 )
- 对于所有 ,
- 每个传感器的位置都不同
详细子任务附加限制及分值如下表所示。
| 子任务 | 分值 | 附加限制 |
|---|---|---|
| 对于所有 , | ||
| 对于所有 , 且 | ||
| 无附加限制 |
示例评测程序
示例评测程序的输入格式如下:
- 第 行:
- 第 行:
示例评测程序的输出格式如下:
- 第 行:
max_level函数返回的值
示例评测程序可能与实际评测程序不同。