THU2015 fall 2-2 Train
描述
某列车调度站的铁道联接结构如图所示。
其中,A为入口,B为出口,S为中转盲端。所有铁道均为单轨单向式:列车行驶的方向只能是从A到S,再从S到B;另外,不允许超车。因为车厢可在S中驻留,所以它们从B端驶出的次序,可能与从A端驶入的次序不同。不过S的容量有限,同时驻留的车厢不得超过m节。
设某列车由编号依次为{1, 2, ..., n}的n节车厢组成。调度员希望知道,按照以上交通规则,这些车厢能否以(a1, a2, ..., an)的次序,重新排列后从B端驶出。
输入
共两行。
第一行为两个数n,m。
第二行为以空格分隔的n个数,表示待判断可行性的驶出序列(a1,a2,...,an)。
输出
仅一行。若驶出序列可行,则输出Yes;否则输出No。
输入样例1
5 2
1 2 3 5 4
输出样例1
Yes
输入样例2
5 5
3 1 2 4 5
输出样例2
No
限制
1 <= n <= 100,000,n为整数
0 <= m <= 100,000,m为整数
待判断的驶出序列保证为{1, 2, ..., n}的一个排列,
时间:1sec
空间:256MB
提示
一级提示
栈混洗
如代如下:
#include <stdio.h>
const int SZ = 1 << 20; //提升IO buff
struct fastio{
char inbuf[SZ];
char outbuf[SZ];
fastio(){
setvbuf(stdin, inbuf, _IOFBF, SZ);
setvbuf(stdout, outbuf, _IOFBF, SZ);
}
}io;
#define N 1600001
int stack[N];
int num[N-1];
int out[2 * N]; // 1-push;0-pop
int main()
{
int n, m;
scanf("%d %d", &n, &m);
for (int i = 0; i < n; i++)
scanf("%d", &num[i]);
int flag = 1; // 1-可行;0-no
int k = 0; // out的下标
int top = 0; // stack的下标
for (int i = 1,j = 0; i <= n && j < n; i++)
{
if (top < m) {
out[k++] = 1;
stack[top++] = i;
} else {
flag = 0;
break;
}
if (i == num[j]) {
j++;
stack[--top] = 0;
out[k++] = 0;
while (top > 0 && stack[top - 1] == num[j]) {
j++;
stack[--top] = 0;
out[k++] = 0;
}
}
}
if (flag == 0 || top != 0) printf("No\n");
else printf("Yes\n");
return 0;
}