[WFOI - 02] I wanna cross the grid(穿越网格)
题目背景
> 相信奇迹的人,本身比奇迹更伟大吧
突然,存档点落到了一个巨大的网格中,只有走过所有必经区域,才能出现下一个存档点...
题目描述
给定一张 $n$ 行 $m$ 列的网格图,行和列从 $1$ 开始编号,定义二元组 $(x,y)$ 表示第 $x$ 行第 $y$ 列的格子,每一行的第 $L$ 到第 $R$ 列的格子是必经区域,形式化地,设 $D$ 是必经区域集合,则 $D=\{(x,y)|1\leq x\leq n,L\leq y\leq R,x,y\in N_+\}$。
每次 kid 可以向上下左右四个方向走一步,且不能超过边界。形式化地,若现在 kid 现在在 $(x,y)$,则 kid 可以走到 $(x+1,y),(x,y+1),(x-1,y),(x,y-1)$。
初始时 kid 在 $(S_x,S_y)$(保证 $S_y=L$),他需要走过所有的必经区域,且任何一个格子最多只经过一次。形式化地,kid 走的路径形如一个二元组序列 $P=(x_1,y_1),(x_2,y_2)...(x_k,y_k)$,需要满足 $\forall (x_0,y_0)\in D,\exist i\in[1,k],(x_0,y_0)=(x_i,y_i)$,且 $\forall i\not= j,(x_i,y_i)\not= (x_j,y_j)$。
同时,kid 还要记录一个通关序列 $p$,当 kid 第一次进入某一行的必经区域之后,就要把行号写在当前序列的后面,且立刻经过本行所有的必经区域。同时,$p$ 必须包含一个长度为 $L_q$ 的子序列 $q$ 才是一个合法的通关序列,从而真正通关。形式化地,$p$ 合法当且仅当存在长度为 $L_q$ 的序列 $c$ 满足 $p_{c_i}=q_i$,且 $c$ 单调上升。
同时,为了给 lindongli2004 降低操作难度,lindongli2004 希望 kid 走的步数越少越好。
给定 $n,m,L,R,S_x,S_y,q$,请你为 kid 规划一条通关路线,或者告诉他不存在一条路线。剩下的操作就交给 lindongli2004 吧!
输入输出格式
输入格式
第一行 $8$ 个正整数 $n,m,L,R,S_x,S_y,L_q,s$,分别表示矩阵的行数和列数,必经区域的左边界和右边界,起点的 $x$ 坐标和 $y$ 坐标,序列 $q$ 的长度和评分参数。
第二行 $L_q$ 个不重复的正整数,表示序列 $q$ 。
输出格式
第一行一个字符串 `YES` 或者 `NO` 表示是否存在一条路径(不包含引号)。
若存在一条路径,第二行一个正整数 $cnt$ 表示路径长度,接下来 $cnt$ 行每行两个正整数 $x,y$ 表示路径的坐标。
输入输出样例
输入样例 #1
5 4 2 3 2 2 2 15
3 1
输出样例 #1
YES
15
2 2
2 3
3 3
3 2
4 2
4 3
5 3
5 2
5 1
4 1
3 1
2 1
1 1
1 2
1 3
说明
#### 数据范围:
$1\leq L\leq R\leq m$,$1\leq S_x\leq n$,其他详见下发文件。
#### 评分规则:
下发文件中第一行的最后一个数为 $s$,设你的操作步数为 $cnt$。那么
- 若 $cnt\leq s$,你将获得 $10$ 分。
- 若 $cnt> s$ 且能通关,你将获得 $9- \frac{cnt-s}{\lfloor\frac{n}{2}\rfloor}$ 分。
- 若你不能通关,你将获得 $0$ 分。
#### checker:
[自取](/paste/c4omcrf2)
使用方法:在同一目录下,把下发的数据放到 data.in 中,把你的答案放到 data.out 中,编译运行即可。
注意事项:
- 此 checker 默认存在一组方案,并 check 该方案是否合法。
- 此 checker 的最大方案容量为 $2.5 \times 10^{8}$ ,也就是说,你的方案中不能有超过 $2.5 \times 10^{8}$ 个数。