luogu#P11590. [KTSC 2022 R2] 安全系统

[KTSC 2022 R2] 安全系统

题目背景

请使用 C++17 或 C++20 提交本题

你需要在程序开头加入如下代码:

#include <vector>

int max_level (std::vector<int> X, std::vector<int> Y, std::vector<int> D, std::vector<int> W);
  

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

题目描述

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 方向发射激光的示例。黑点表示激光传感器,红线表示激光。

i(0iN1)i (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 之间的整数。

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

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

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

输入格式

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

  • 11 行:NN
  • 2+i(0iN1)2+i (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 函数返回的值。

4
1 1 1 1
2 2 1 1
3 3 4 1
4 4 4 1

2

10
5 10 1 127
7 9 1 130
5 6 3 22
8 10 2 60
7 6 3 43
9 6 2 23
8 6 3 9
5 8 2 27
6 7 2 175
8 9 2 57

673

10
4 3 2 90
1 3 4 122
9 8 2 105
5 10 2 106
9 1 2 125
8 1 4 72
4 8 4 142
9 6 4 78
8 9 2 68
4 10 4 99

1007

10
8 8 1 38
10 6 3 11
1 4 1 150
3 7 2 91
5 3 4 30
8 9 2 147
5 1 4 164
3 4 2 6
4 1 3 104
5 4 1 19

593

提示

样例解释 #1

考虑 $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
  • 对于所有 i(0iN1)i (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)
  • 对于所有 i(0iN1)i (0 \leq i \leq N-1)1W[i]1051 \leq W[i] \leq 10^5
  • 每个传感器的位置都不同。

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

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