THU2015 fall 2-2 Train

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;
}



评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值