描述
opPush市有一个著名的火车站,该火车站建于上个世纪。 由于资金有限及缺乏可用空间,此火车站只有一个轨道,如图所示。
该火车站的运作方式是每列火车从A方向进站,进站后的火车以某种方式进行重组后出站继续沿B方向行驶。 假设从方向A到达的火车有N( N <= 1000)列,进站的次序按照递增的顺序1,2,…,N 编号。
火车重组的负责人想知道这 N 列火车是否有可能在B方向上以a1,a2,…,aN 的次序出站继续行驶。 请你帮助他编写一个程序,决定是否有可能获得所需的列车出站顺序。
输入格式
输入由若干行组成。第一行输入N M两个整数,N表示有N列火车按照1,2,…,N的次序从A方向进站,M表示接下来有M行输入,每行输入有N个数,表示一种要判断是否可能的出站序列。
输出格式
输出M行,每行输出YES或NO,如果当前这种出站序列是可能的则输出YES,不可能则输出NO。
输入样例
5 2
1 2 3 4 5
5 4 1 2 3
输出样例
YES
NO
题意:给一个由1->n的入栈序列,问:题给的出栈序列是否合法 |
思路:
1.首先我们可以从最简单的情况开始分析,一定满足题意的一种出栈序列就是原序列,也就是进来一个出去一个。下面以n=6为例
2.然后我们假设有个出栈序列是4 3 5 6 2 1,很明显,这是乱序的,那怎么检验合法呢?不妨模拟一遍这个过程。
·首先是4出栈,这说明什么,说明1->3已经入栈了,这样才能让4出栈。如图,R指针相当于栈顶元素,现在栈顶在4这个位置,i=4(下标从1开始)
·然后3出栈,因为3就在原来4的旁边,所以出栈合法,就是前面把4pop掉,栈顶元素就是3 。我们把前面4走过的地方标记为-1,代表这个点我们已经走过了(或者说这个位置已经没有元素可以pop了)
·接着5出栈,这时候5在3的右边,我们发现只要当前的元素比栈顶元素大,那就不用管什么,直接把之间差的元素都push进来,自然大的那个就变成栈顶(这个例子还不直观,我们看1 3 2,1出栈,下一个是3,明显我们把1->3的元素都push进来,3就是栈顶,然后pop 3,再pop2),然后指针移动到5,同时标记过走过的点,代表该位置为空。
·下一个6就同理了。
·然后下一个元素是2,可我们现在的栈顶是6,怎么知道栈顶下一个就是2呢?这时