CF936D.World of Tank
NOI/NOI+/CTSC
通过率:0%
时间限制:2.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
Vitya loves programming and problem solving, but sometimes, to distract himself a little, he plays computer games. Once he found a new interesting game about tanks, and he liked it so much that he went through almost all levels in one day. Remained only the last level, which was too tricky. Then Vitya remembered that he is a programmer, and wrote a program that helped him to pass this difficult level. Try do the same.
The game is organized as follows. There is a long road, two cells wide and n cells long. Some cells have obstacles. You control a tank that occupies one cell. Initially, the tank is located before the start of the road, in a cell with coordinates (0, 1). Your task is to move the tank to the end of the road, to the cell (n + 1, 1) or (n + 1, 2).

Every second the tank moves one cell to the right: the coordinate x is increased by one. When you press the up or down arrow keys, the tank instantly changes the lane, that is, the y coordinate. When you press the spacebar, the tank shoots, and the nearest obstacle along the lane in which the tank rides is instantly destroyed. In order to load a gun, the tank needs t seconds. Initially, the gun is not loaded, that means, the first shot can be made only after t seconds after the tank starts to move.
If at some point the tank is in the same cell with an obstacle not yet destroyed, it burns out. If you press the arrow exactly at the moment when the tank moves forward, the tank will first move forward, and then change the lane, so it will not be possible to move diagonally.
Your task is to find out whether it is possible to pass the level, and if possible, to find the order of actions the player need to make.
维佳热爱编程和解题,但有时为了稍作放松,他也会玩电脑游戏。有一次,他发现了一款关于坦克的新颖有趣的游戏,非常喜欢,以至于一天之内几乎通关了所有关卡。只剩最后一关过于困难。这时维佳想起自己是一名程序员,便编写了一个程序,帮助他顺利通过了这一难关。你也来试试吧。
游戏规则如下:有一条很长的道路,宽度为两格,长度为 n 格。部分格子上有障碍物。你操控一辆占据一个格子的坦克。初始时,坦克位于道路起点之前,坐标为 (0,1)。你的任务是将坦克移动至道路终点,即坐标为 (n+1,1) 或 (n+1,2) 的格子。

每秒钟,坦克向右移动一格:横坐标 x 增加 1。当你按下上方向键或下方向键时,坦克立即切换车道(即纵坐标 y 改变)。当你按下空格键时,坦克开火,同一车道内距离坦克最近的障碍物将被瞬间摧毁。火炮装填需耗时 t 秒;初始时火炮未装填,也就是说,第一次射击只能在坦克开始移动 t 秒后进行。
若在某一时刻,坦克所处格子中存在尚未被摧毁的障碍物,则坦克将被烧毁。若你恰好在坦克向前移动的同一时刻按下方向键,则坦克会先完成向前移动,再切换车道,因此无法实现斜向移动。
你的任务是判断该关卡是否可通关;若可以,则找出玩家所需执行的操作序列。
输入格式
The first line contains four integers n, _m_1, _m_2 and t, the length of the field, the number of obstacles in the first lane, the number of obstacles in the second lane and the number of tank steps before reloading, respectively (1 ≤ n ≤ 109; 0 ≤ _m_1, _m_2 ≤ n; 0 ≤ _m_1 + _m_2 ≤ 106; 1 ≤ t ≤ n).
The next two lines contain a description of the obstacles. The first of these lines contains _m_1 numbers x__i — the obstacle coordinates in the first lane (1 ≤ x__i ≤ n; x__i < x__i + 1). The y coordinate for all these obstacles will be 1.
The second line contains _m_2 numbers describing the obstacles of the second lane in the same format. The y coordinate of all these obstacles will be 2.
第一行包含四个整数 n、m1、m2 和 t,分别表示场地的长度、第一条车道中障碍物的数量、第二条车道中障碍物的数量,以及坦克在重新装弹前可移动的步数(1 ≤ n ≤ 109;0 ≤ m1, m2 ≤ n;0 ≤ m1 + m2 ≤ 106;1 ≤ t ≤ n)。
接下来两行描述障碍物。其中第一行包含 m1 个整数 xi,表示第一条车道中障碍物的横坐标(1 ≤ xi ≤ n;xi < xi+1)。所有这些障碍物的纵坐标 y 均为 1。
第二行包含 m2 个整数,以相同格式描述第二条车道中的障碍物。所有这些障碍物的纵坐标 y 均为 2。
输出格式
In the first line print «Yes», if it is possible to pass the level, or «No», otherwise.
If it is possible, then in the second line print the number of times the tank moves from one lane to another, and in the next line print the coordinates of the transitions, one number per transition: the coordinate x (0 ≤ x ≤ n + 1). All transition coordinates coordinates must be distinct and should be output in strictly increasing order.The number of transitions should not exceed 2·106. If the tank can pass the level, then it can do it using no more than 2·106 transitions.
In the fourth line print the number of shots that the tank makes during the movement, in the following lines print two numbers, x and y coordinates of the point (1 ≤ x ≤ n, 1 ≤ y ≤ 2), from which the tank fired a shot, the number of shots must not exceed _m_1 + _m_2. Shots must be output in the order in which they are fired.
If there are several solutions, output any one.
第一行输出“是”,如果可以通关;否则输出“否”。
如果可以通关,则第二行输出坦克在不同车道之间移动的次数;第三行输出每次移动发生位置的横坐标 x(每个 x 满足 0≤x≤n+1),每个坐标占一行。所有横坐标必须互不相同,且严格递增。移动次数不得超过 2⋅106。若坦克能够通关,则必存在一种方案,其移动次数不超过 2⋅106。
第四行输出坦克在移动过程中射击的总次数;随后每行输出两个整数,即射击点的横、纵坐标 (x,y)(其中 1≤x≤n,1≤y≤2)。射击总次数不得超过 m1+m2。射击事件须按实际发生的顺序输出。
若存在多种解法,输出任意一种即可。
输入输出样例
输入#1
6 2 3 2 2 6 3 5 6
输出#1
Yes 2 0 3 2 2 2 4 1
输入#2
1 1 1 1 1 1
输出#2
No
输入#3
9 5 2 5 1 2 7 8 9 4 6
输出#3
Yes 4 0 3 5 10 1 5 2
说明/提示
Picture for the first sample test.

第一个样例测试的图片。

输入解题思路,AI测评打分。不知道怎么写?