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>
//#include <stdlib.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 2000001

int max(int x, int y)
{
	return x > y ? x : y;
}

class Stack
{
public:
	Stack();
	~Stack();
	bool empty();
	void push(int);
	int pop();
	int top();
private:
	int *stack;
	int loc;
	int capacity;
};

Stack::Stack()
{
	capacity = N;
	stack = new int[capacity];
	loc = 0;
}
Stack::~Stack()
{
	delete[] stack;
}
bool Stack::empty()
{
	if (0 == loc) return true;
	else return false;
}

void Stack::push(int value)
{
	stack[++loc] = value;
}

int Stack::pop()
{
	if (!empty()) return stack[loc--];
	else return -1;
}

int Stack::top()
{
	return stack[loc];
}

class SSqueue
{
public:
	SSqueue()
	{
		while (!s1.empty()) s1.pop();
		while (!s11.empty()) s11.pop();
		while (!s2.empty()) s2.pop();
		while (!s22.empty()) s22.pop();
	}
	void put(const int &e)
	{
		s22.push(max(e, s22.empty() ? e : s22.top()));
		s2.push(e);
	}

	int remove()
	{
		if (s1.empty())
		{
			while (!s2.empty())
			{
				int e = s2.top();
				s2.pop();
				s22.pop();
				s1.push(e);
				s11.push(max(e, s11.empty() ? e : s11.top()));
			}
		}
		int ret = s1.top();
		s1.pop();
		s11.pop();
		return ret;
	}
	int getMax()
	{
		if (s1.empty())
		{
			while (!s2.empty())
			{
				int e = s2.top();
				s2.pop();
				s22.pop();
				s1.push(e);
				s11.push(max(e, s11.empty() ? e : s11.top()));
			}
		}
		return max(s11.top(), s22.empty() ? 0 : s22.top());
	}
private:
	Stack s1, s11, s2, s22;
};

int main()
{
	int n;
	scanf("%d", &n);
	SSqueue ss;
	while (n--)
	{
		char c;
		while (scanf("%c", &c) && c != 'E' && c != 'D' && c != 'M');
		switch (c)
		{
		case 'E':
			int a;
			scanf("%d", &a);
			ss.put(a);
			break;
		case 'D':
			printf("%d\n", ss.remove());
			break;
		case 'M':
			printf("%d\n", ss.getMax());
			break;
		}
	}
	return 0;
}


你可能感兴趣的:(tra,Fall,2-2,栈混洗,THU2015,列车调度)