#P4279. 「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 个激光传感器,每个传感器从 00 到 N−1N-1 编号。我们需要设计一个安全系统,通过这些激光传感器来检测入侵者。

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

激光发射的方向用 11 到 44 的数字表示。11 表示向上,22 表示向右,33 表示向下,44 表示向左。下图依次展示了激光传感器向 11、22、33、44 方向发射激光的示例。黑点表示激光传感器,红线表示激光。

第 ii (0≤i≤N−1)(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] 是 11 到 NN 之间的整数。

我们可以自由决定每个激光传感器是否启动。但如果不同的激光传感器发射的激光相遇,会导致检测错误,因此激光不能相交,包括端点。下图展示了激光相交的示例,激光可以在一个点相交,也可以在一条线段上相交。

第 ii (0≤i≤N−1)(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 (0≤i≤N−1)(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。

数据范围与提示

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

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

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

子任务 分值 附加限制
11 55 N≤18N \leq 18
22 88 N≤36N \leq 36
33 2121 N≤100N \leq 100
44 1515 N≤500N \leq 500
55 1111 对于所有 ii (0≤i≤N−1)(0 \leq i \leq N-1),D[i]∈{1,2,3}D[i] \in \{1,2,3\}
66 1717 对于所有 i,ji,j (0≤i<j≤N−1)(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 (0≤i≤N−1)(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 函数返回的值

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