#6179. 车厢调度 暂未评定

时间限制:1000 ms 内存限制:128 MiB 标准输入输出
题目类型:传统 评测方式:文本比较
上传者: apollowr

题目描述

有一个火车站,每辆火车都从A方向驶入火车站,再从B方向驶出火车站,同时它的车厢可以进行某种方式的重新组合。假设从A方向驶来的火车有n节车厢(n<=1000),分别按顺序编号为1,2,3,…n。假设进入车站之前每节车厢之间都是不连接的,并且它们可以自由移动,直到驶入B方向上的铁轨上。另外假设C站可以停放任意节车厢,但一旦进入C,只能去B,不能向A回退,一旦进入B,就不能回到C了。

试判断从B方向驶出的a1,a2,..an的顺序是否是合理的。

输入格式

第一行整数n,表示n辆车厢,第二行n个元素,表示期待B出现的排列情况。

输出格式

YES或者NO表示这个序列是否可行

样例

样例输入 1

5
3 5 4 2 1

样例输出 1

YES

样例输入 2

6
6 5 4 3 2 1

样例输出 2

YES

数据范围与提示

解析:观察发现,整个调度过程其实是在模拟入栈出栈的过程,而这个过程中,我们可以分成三种状态:栈前、栈中、栈后。我们可以发现,当某个数字出栈了,说明比它小的数字要么已经出栈了,要么还在栈里,不能是入栈前状态,并且在栈中的顺序是从大到小的(从栈顶往栈底看),比如出5,那么1,2,3,4要么已经在5之前出了,要么还在栈中(假如1,3,4在栈中,从栈顶往栈底看依次为4,3,1),不能是入栈前的状态。如果某个数字要出栈,那么当前在栈中的数字都必须小于它,否则就与栈的性质矛盾,不合法,于是我们可以这样解决:

从第一个数字开始扫描,a[i]表示当前出栈的数字,如果有比a[i]大的数字还在栈中,那么就产生矛盾,输出“NO”;否则,标记当前数字a[i]为栈后状态,那么[1, a[i]-1]这些数字如果还没出栈,标记为栈中状态。具体我们可以用0表示为确定状态,1表示栈中状态,2表示栈后状态。