CF936D World of Tank
题目背景
Vitya 是一名热爱编程与解题的选手,但有时也玩游戏来放松。某日他发现一款坦克类游戏,并在一天内几乎通关,仅剩最后一关难以突破。于是他发挥程序员的优势,写程序帮助自己通关。现在请你也来试试吧!
题目描述
游戏地图是一条长为 $n$、宽为 $2$ 的路径(两行 $n$ 列)。地图上部分格子存在障碍。你控制的坦克初始在坐标 $(0,1)$,目标是到达 $(n+1,1)$ 或 $(n+1,2)$。

每一秒坦克自动向右移动一格(即 $x$ 坐标加 1)。你可以随时按“上下箭头”使坦克立即切换车道(即 $y$ 坐标变为 1 或 2),但不能斜着移动。如果你在某一秒恰好移动+切换车道,先移动再切换。
你也可以按“空格键”使坦克开火,摧毁当前车道上**最前方未摧毁的**障碍(即同一条直线上,最近的障碍)。但坦克装弹需要 $t$ 秒,开始时未装弹,意味着第一次射击必须在第 $t$ 秒或之后。
若某一刻坦克进入含有尚未摧毁的障碍的格子,则游戏失败。
你的目标是判断坦克能否成功通关(到达 $(n+1,1)$ 或 $(n+1,2)$),若能,请输出一组合法的操作方案。
输入格式
第一行四个整数 $n, m_1, m_2, t$,分别表示路径长度、第 1 行的障碍数、第 2 行的障碍数、装弹所需秒数。
$1 \le n \le 10^9$,$0 \le m_1, m_2 \le n$,$0 \le m_1 + m_2 \le 10^6$,$1 \le t \le n$。
接下来两行:
- 第 2 行包含 $m_1$ 个整数 $x_i$,表示第 1 行中障碍的位置(按升序排列)。
- 第 3 行包含 $m_2$ 个整数 $x_i$,表示第 2 行中障碍的位置(按升序排列)。
输出格式
第一行输出 `Yes` 表示存在合法通关方案;否则输出 `No`。
若输出 `Yes`,则按以下格式继续输出:
第二行输出切道(换轨)操作的次数 $k$。
第三行输出 $k$ 个整数,表示每次切道操作发生时的横坐标 $x$(满足 $0 \le x \le n+1$)。这些 $x$ 值需严格递增,且不能重复。切道次数不能超过 $2 \cdot 10^6$。可以证明,若存在可行方案,则一定存在满足这个限制的方案。
第四行输出坦克在通关过程中开火的总次数 $s$。
接下来的 $s$ 行中,每行两个整数 $x, y$,表示坦克在坐标 $(x, y)$ 处开火(满足 $1 \le x \le n$, $1 \le y \le 2$)。所有开火操作需按实际执行顺序依次输出。
如果存在多个通关方案,输出任意一种即可。
说明/提示
下图展示了第一个样例的路线示意图:
