P13161 [GCJ 2017 Qualification] Fashion Show
题目描述
你即将举办一场时装秀,展示三种新款服装。秀场的舞台是最时尚的形状:一个 $N \times N$ 的网格。
网格中的每个格子可以是空的(用 `.` 表示),也可以有一位时装模特。模特分为三种类型,取决于他们所穿的服装风格:`+`、`x`,以及超级时尚的 `o`。一个格子中如果有 `+` 或 `x` 型模特,将为秀场增加 1 分风格分;如果有 `o` 型模特,则增加 2 分风格分。空格子不加分。
为了达到最佳艺术效果,模特的摆放有如下规则:
- 只要有两个模特处于同一行或同一列,这两个模特中至少有一个必须是 `+`。
- 只要有两个模特处于同一对角线,这两个模特中至少有一个必须是 `x`。
形式化地说,若一个模特位于第 $i_0$ 行第 $j_0$ 列,另一个模特位于第 $i_1$ 行第 $j_1$ 列,则当 $i_0 = i_1$ 时他们同一行,当 $j_0 = j_1$ 时同一列,当 $i_0 + j_0 = i_1 + j_1$ 或 $i_0 - j_0 = i_1 - j_1$ 时同一对角线。
例如,下面这个网格是不合法的:
```
...
x+o
.+.
```
中间一行有一对模特(`x` 和 `o`),但其中没有 `+`。从底行的 `+` 到中间行的 `o` 的对角线上有两个模特,但都不是 `x`。
而下面这个网格是合法的,没有任何行、列或对角线违反规则:
```
+.x
+x+
o..
```
你的艺术顾问已经按照规则在某些格子中预先放置了 $M$ 个模特。你可以在任意数量(包括零个)格子中自由添加任意类型的模特。你不能移除已有的模特,但可以将已有的 `+` 或 `x` 型模特升级为 `o` 型,只要不违反上述规则。
你的任务是找到一种合法的放置和/或升级方式,使得获得的风格分最大。
输入格式
第一行输入一个整数 $T$,表示测试用例的数量。接下来有 $T$ 组测试数据。每组测试数据的第一行包含两个整数 $N$ 和 $M$。接下来 $M$ 行,每行包含一个字符(`+`、`x` 或 `o`)和两个整数 $R_i$、$C_i$,表示该模特的类型和位置。网格的行从上到下编号为 $1$ 到 $N$,列从左到右编号为 $1$ 到 $N$。
输出格式
对于每个测试用例,首先输出一行 `Case #x: y z`,其中 $x$ 是测试用例编号(从 1 开始),$y$ 是你安排下获得的风格分,$z$ 是你添加和/或替换的模特总数。然后,对于每一个你添加或替换的模特,输出一行,格式与输入部分相同,字符为你添加或替换的模特类型。这 $z$ 行顺序不限。
如果有多种合法方案,你可以输出其中任意一种。
说明/提示
**样例说明**
样例输出展示了样例数据的一组解。其他解也是可能的。注意最后一个样例不会出现在 Small 数据集中。
在样例 1 中,网格为 $2 \times 2$,初始为空。输出对应如下网格(用 `.` 表示空格):
```
x.
+o
```
在样例 2 中,唯一的格子已经被 `o` 型模特占据,无法再添加或替换模特。
在样例 3 中,初始网格如下:
```
...
+++
x..
```
输出对应如下网格:
```
.x.
++o
x..
```
**数据范围**
- $1 \leq T \leq 100$。
- $1 \leq N \leq 100$。
- $1 \leq C_i \leq N$,对所有 $i$。
- $0 \leq M \leq N^2$。
- 不会有两个预放置的模特在同一格子。
- 保证所有预放置的模特均符合规则。
**小数据(10 分,测试集 1 - 可见)**
- $R_i = 1$,对所有 $i$。(所有预放置的模特都在第一行。你可以在该行添加/替换模特,也可以在其他行添加模特。)
**大数据(25 分,测试集 2 - 隐藏)**
- $1 \leq R_i \leq N$,对所有 $i$。
由 ChatGPT 4.1 翻译