refresh的停车场
Time Limit: 1000MS Memory limit: 65536K
题目描述
refresh最近发了一笔横财,开了一家停车场。由于土地有限,停车场内停车数量有限,但是要求进停车场的车辆过多。当停车场满时,要进入的车辆会进入便道等待,最先进入便道的车辆会优先
进入停车场,而且停车场的结构要求只出去的车辆必须是停车场中最后进去的车辆。现告诉你停车场容量N以及命令数M,以及一些命令(Add num 表示车牌号为num的车辆要进入停车场或便道,
Del 表示停车场中出去了一辆车,Out 表示便道最前面的车辆不再等待,放弃进入停车场)。假设便道内的车辆不超过1000000.
输入
输入为多组数据,每组数据首先输入N和M(0< n,m <200000),接下来输入M条命令。
输出
输入结束后,如果出现停车场内无车辆而出现Del或者便道内无车辆而出现Out,则输出Error,否则输出停车场内的车辆,最后进入的最
先输出,无车辆不输出。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 22000
int nn;
typedef struct
{
long long *top;
long long *end;
int len;
int list;
}sq;
typedef struct
{
long long *a;
int front;
int rear;
}qu;
void initl(sq &l)
{
l.end=(long long*)malloc(max*sizeof(long long));
l.top=l.end;
l.len=0;
l.list=max;
}
void inits(qu &s)
{
s.a=(long long *)malloc(max*sizeof(long long));
s.front=0;
s.rear=s.front;
}
void bianadd(qu &s,long long num)
{
if(s.rear<1000000)
{
s.a[s.rear]=num;
s.rear++;
}
}
void add(sq &l,qu &s,long long num)
{
if(l.len<nn)
{
*l.top=num;
l.top++;
l.len++;
}
else
{
bianadd(s,num);
}
}
void del(sq &l,qu &s)
{
l.top--;
l.len--;
if(s.rear>s.front)
{
*l.top=s.a[s.front];
l.top++;
l.len++;
for(int i=s.front;i<s.rear-1;i++)
{
s.a[i]=s.a[i+1];
}
s.rear--;
}
//printf("%lld ",*(l.top-1));
}
void out(qu &s)
{
int i;
for(i=s.front;i<s.rear-1;i++)
s.a[i]=s.a[i+1];
s.rear--;
}
void dis(sq &l,int t)
{
if(t==1) printf("Error\n");
else
{
while(l.top>l.end)
{
printf("%lld\n",*(l.top-1));
l.top--;
}
}
}
int main()
{
int n,m;
sq l;
qu s;
int t;
while(~scanf("%d %d",&n,&m))
{
t=0;
nn=n;
initl(l);
inits(s);
while(m--)
{
char c[100];
scanf("%s",c);
if(c[0]=='A')
{
long long num;
scanf("%lld",&num);
add(l,s,num);
}
else if(c[0]=='D')
{
if(l.top==l.end) t=1;
else del(l,s);
}
else if(c[0]=='O')
{
if(s.front==s.rear) t=1;
else out(s);
}
}
dis(l,t);
}
return 0;
}
先输出,无车辆不输出。
示例输入
2 6 Add 18353364208 Add 18353365550 Add 18353365558 Add 18353365559 Del Out
示例输出
18353365558 18353364208
提示