#P14526. [2026年省队模拟联测]楼房重建

[2026年省队模拟联测]楼房重建

题目背景

小 C 在玩 MC。

题目描述

小 C 建造了一栋用 kk 种方块构建的房子,其中一个方块点组 (x,y,z,tp)(x,y,z,tp) 表示在点 (x,y,z)(x,y,z) 上有一个类型为 tptp 的方块,保证每种方块至少出现一次

由于小 C 喜欢连通块,所以小 C 的房子满足:对于每种方块,所有这种方块都是六连通的。换句话说,对于每一对类型均为 tptp 的方块,可以只经过类型为 tptp 并且两两有公共面的方块,从一个走到另一个。

由于宇宙射线的影响,小 C 的楼房只剩下一块地基了,小 C 的地基是一个 n×mn\times m 的矩形,坐标在 (1,1,1)(1,1,1)(n,1,m)(n,1,m) 之间,其余的方块都被摧毁了,你要帮小 Z 还原她的楼房。

由于小 C 没有开创造,所以小 C 的楼房总共不超过 3.5×1053.5\times10^5 个方块。

数据保证有解。

输入格式

第一行三个正整数 n,m,kn,m,k,表示地基大小和方块种类数。

第二行至第 n+1n+1 行,每行 mm 个正整数 ai,ja_{i,j},第 i+1i+1 行第 jj 个表示地基的方块点组 (i,1,j,ai,j)(i,1,j,a_{i,j})

输出格式

第一行输出一个正整数 tt,你需要保证 t+nm3.5×105t+nm\le 3.5\times10^5

接下来 tt 行,每行四个正整数 x,y,z,tpx,y,z,tp,表示你添加的一个方块点组 (x,y,z,tp)(x,y,z,tp)

你需要保证,没有两个方块在相同的位置(包括原有的地基),且 1x,y,z2001\le x,y,z\le 2001tpk1\le tp\le k

若有多解,输出任意一个均可。

样例 1 输入

2 2 2
1 2
2 1

样例 1 输出

8
1 2 1 1
1 2 2 1
2 2 2 1
1 1 3 2
2 1 3 2
3 1 3 2
3 1 2 2
3 1 1 2

样例 1 解释

这是地基:

2026-01-28_09.56.29.png

其中绿色玻璃为方块 11,蓝色玻璃为方块 22

这是添加方块后的房子:

2026-01-28_09.51.41.png

样例 2 输入

3 3 3
1 1 1
3 2 1
3 3 3

样例 2 输出

0

数据范围

本题使用子任务(Subtask)计分。你需要通过一个子任务内所有测试数据才可以获得相应的得分。

对于所有测试数据,保证:

  • 1n,m501\le n,m\le50
  • 1ai,jkmin(50,n×m)1\le a_{i,j}\le k\le \min(50,n\times m)
子任务编号 n,mn,m\le kk\le 分值
11 33 min(50,n×m)\min(50,n\times m) 1010
22 55 ^
33 1010 1515
44 5050 22 1010
55 ^ 33 1515
66 4848 min(50,n×m)\min(50,n\times m) 2525
77 5050 ^ 1515

提示

下发文件中含有 checker.cpp\boldsymbol{checker.cpp},它可以帮助你进行一些调试。

使用 g++ checker.cpp -o checker -O2 -std=c++14 将文件编译后,使用命令

./checker in.txt out.txt ans.txt (Linux)
checker.exe in.txt out.txt ans.txt (Windows)

即可使用。