#HK4279. 「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 表示向左。下图依次展示了激光传感器向 11223344 方向发射激光的示例。黑点表示激光传感器,红线表示激光。

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);
  • X, Y, D, W:长度为 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=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});

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

因此,函数应返回 2

数据范围与提示

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

  • 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
  • 每个传感器的位置都不同

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

子任务 分值 附加限制
11 55 N18N \leq 18
22 88 N36N \leq 36
33 2121 N100N \leq 100
44 1515 N500N \leq 500
55 1111 对于所有 ii (0iN1)(0 \leq i \leq N-1)D[i]{1,2,3}D[i] \in \{1,2,3\}
66 1717 对于所有 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]
77 2323 无附加限制

示例评测程序

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

  • 11 行:NN
  • 2+i2+i (0iN1)(0 \leq i \leq N-1) 行:X[i]Y[i]D[i]W[i]X[i]\,Y[i]\,D[i]\,W[i]

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

  • 11 行:max_level 函数返回的值

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