#L4279. 「KTSC 2022 R2」安全系统

「KTSC 2022 R2」安全系统


注意事项

在 LibreOJ 上,由于语言限制,目前只支持以下语言的提交:

  • C++(标准为 C++ 17 及以上)

请在提交源代码前添加 #include "security.h"


题目描述

题目译自 2022년도 국제정보올림피아드 대표학생 선발고사 - 2차 선발고사 T4 「보안 시스템」

KOI 国的机密设施可以表示为一个在坐标平面上的正方形,其左下角顶点为 (0,0)(0,0),右上角顶点为 (N+1,N+1)(N+1, N+1),边与坐标轴平行。正方形的每条边代表机密设施的墙壁。

在机密设施内有 NN 个激光传感器,每个传感器从 00N1N-1 编号。我们需要设计一个安全系统,通过这些激光传感器来检测入侵者。

每个激光传感器可以表示为坐标平面上的一个点。当激光传感器启动时,它会向上(+y+y 轴方向)、向右(+x+x 轴方向)、向下(y-y 轴方向)或向左(x-x 轴方向)发射激光。激光会一直延伸到碰到墙壁为止,因此激光的路径可以表示为从传感器位置到墙壁上的某个点的线段。

激光发射的方向用 1144 的数字表示:

  • 11 表示向上
  • 22 表示向右
  • 33 表示向下
  • 44 表示向左

ii (0iN1)(0 \leq i \leq N-1) 个激光传感器位于 (X[i],Y[i])(X[i], Y[i]),启动时会向 D[i]D[i] 方向发射激光。不同的激光传感器位于不同的位置。X[i]X[i]Y[i]Y[i]11NN 之间的整数。

我们可以自由决定每个激光传感器是否启动。但如果不同的激光传感器发射的激光相遇,会导致检测错误,因此激光不能相交,包括端点。

ii (0iN1)(0 \leq i \leq N-1) 个激光传感器的重要性为 W[i]W[i],表示启动该传感器对安全的贡献值。整个安全系统的安全级别是启动的激光传感器的重要性之和。

请编写一个函数,在确保激光不相交的前提下,决定哪些激光传感器启动,使得安全级别最大。


实现细节

你需要实现以下函数:

int max_level(vector<int> X, vector<int> Y, vector<int> D, vector<int> W);
  • XX, YY, DD, WW:长度为 NN 的整数数组。对于每个 ii (0iN1)(0 \leq i \leq N-1),第 ii 个激光传感器的坐标为 (X[i],Y[i])(X[i], Y[i]),启动时向 D[i]D[i] 方向发射激光,重要性为 W[i]W[i]
  • 该函数返回在确保激光不相交的前提下,最大可能的安全级别。

注意,提交的代码中不应包含任何输入输出操作。


样例

考虑 N=4N=4, X=[1,2,3,4]X=[1,2,3,4], Y=[1,2,3,4]Y=[1,2,3,4], D=[1,1,4,4]D=[1,1,4,4], W=[1,1,1,1]W=[1,1,1,1] 的情况。

评测程序将调用如下函数:

max_level({1, 2, 3, 4}, {1, 2, 3, 4}, {1, 1, 4, 4}, {1, 1, 1, 1});

下图展示了机密设施及其内部的传感器,以及传感器发射的激光。启动 00 号和 11 号传感器,或启动 22 号和 33 号传感器,激光不会相交,安全级别为 22。没有比这更高的安全级别的方案。

因此,函数应返回 22


数据范围与提示

对于所有输入数据,满足:

  • 1N15001 \leq N \leq 1500
  • 对于所有 ii (0iN1)(0 \leq i \leq N-1)1X[i],Y[i]N1 \leq X[i], Y[i] \leq N
  • D[i]{1,2,3,4}D[i] \in \{1,2,3,4\}(对于所有 0iN10 \leq i \leq N-1
  • 对于所有 ii (0iN1)(0 \leq i \leq N-1)1W[i]1051 \leq W[i] \leq 10^5
  • 每个传感器的位置都不同

详细子任务附加限制及分值如下表所示。

子任务 分值 附加限制
1 5 N18N \leq 18
2 8 N36N \leq 36
3 21 N100N \leq 100
4 15 N500N \leq 500
5 11 对于所有 ii (0iN1)(0 \leq i \leq N-1)D[i]{1,2,3}D[i] \in \{1,2,3\}
6 17 对于所有 i,ji,j (0i<jN1)(0 \leq i < j \leq N-1)X[i]X[j]X[i] \neq X[j]Y[i]Y[j]Y[i] \neq Y[j]
7 23 无附加限制

示例评测程序

示例评测程序的输入格式如下:

第 1 行:N
第 2+i (0 ≤ i ≤ N-1) 行:X[i] Y[i] D[i] W[i]

示例评测程序的输出格式如下:

第 1 行:max_level 函数返回的值

示例评测程序可能与实际评测程序不同。