#C1014. 爆破

爆破

【题目描述】

给定一个 NNNN 列的由 #. 组成的地图 AA

你有一个初始全为 00 的超级大二维数组 hh

对于一次操作 F(x,y)F(x,y)(你要保证 0x,y1090 \le |x|,|y| \le 10^9),表示:

$$\Large\forall_{i \in \left[ x,x+N-1 \right] \cap \left[1,N\right],j \in \left[ y,y+N-1 \right] \cap \left[1,N\right]} h_{i,j} \gets h_{i,j} - 1$$

问能否通过不超过 KK 次操作使得任意的 (x,y)(x,y)(z,w)(z,w),若 Ax,yA_{x,y}#Az,wA_{z,w}.,都有 hx,y<hz,wh_{x,y} < h_{z,w},即所有 # 的位置都比 . 的位置小。

如果有请输出方案。

【输入格式】

explosion.in 读入数据。

本题单个测试点有多组测试数据。

第一行一个正整数 TT 表示数据组数。接下来,对于每组数据有:

第一行两个正整数 N,KN,K 分别表示网格大小以及操作次数的最大值。

接下来 NN 行每行 NN 个字符,第 ii 行第 jj 个字符表示 Ai,jA_{i,j}

【输出格式】

输出数据到 explosion.out 中。

对于每组数据,首先输出一行一个字符串 YesNo

Yes 表示能够通过操作满足题目的条件,No 表示不能通过操作满足题目条件。

如果输出 Yes,后面还要输出你的方案,具体如下:

第一行输出一行一个整数 kk 表示有 kk 个操作,你需要保证 kKk \le K,否则该测试点得零分。

接下来 kk 行,每行两个整数 x,yx,y 表示进行一次操作 F(x,y)F(x,y)

【样例 1 输入】
4
1 2
.
1 2
#
2 8
#.
.#
3 36
...
.#.
...
【样例 1 输出】
Yes
0
Yes
0
Yes
2
0 0
2 2
Yes
4
-114514 -1919810
0 0
0 2
2 0
【样例 2】

见选手目录下的 explosion/explosion2.inexplosion/explosion2.ans

该样例满足测试点 11 的约束条件。

【样例 3】

见选手目录下的 explosion/explosion3.inexplosion/explosion3.ans

该样例满足测试点 44 的约束条件。

【数据范围】

对于 100%100\% 的数据,保证:1N1001 \le N \le 1001N,T8001 \le \sum N,T \le 8002×N2K2\times N^2 \le K

测试点编号 NN \le K=K= 特殊性质
11 33 400400
22 100100 2×N22\times N^2 A
33 2×N22 \times N^2 B
44 4×N24 \times N^2
55 2×N22 \times N^2

特殊性质 A:只存在一个位置 (x,y)(x,y) 满足 Ax,y=.A_{x,y}=.

特殊性质 B:只存在一个位置 (x,y)(x,y) 满足 Ax,y=#A_{x,y}=\#

【提示】

提供了 checker.cpp,保证与评测使用的完全不同不保证能成功判断你的代码正误,你需要通过如下指令使用,正确会说 AC,错误我也不知道会说什么。

打开 powershell 并进入当前文件夹;

编译:g++ checker.cpp -o checker -std=c++14 -Wall -O2

运行:./checker explosion.in explosion.out explosion.ans

explosion.ans 表示答案。