Freda的佇列 簡單模擬
阿新 • • 發佈:2018-12-02
Freda的佇列
Problem Description
Freda有一個佇列,最初它是空的。
現在Freda接到了一系列指令,每個指令包含一個整數x。
如果x>0,表示在佇列開頭加入一個數x。
如果x=0,表示把佇列複製一份,並接在現有佇列的末尾。
如果x=-1,表示彈出佇列頭部的數,並輸出這個數值。
但是指令實在是太多了,Freda實在是計算不過來每次要輸出什麼數值,請你幫幫她吧。
Input
第一行包含一個整數N,表示指令的個數。
接下來N行每行一個整數x,描述每條指令。
Output
對於每條x=-1的指令,若此時佇列不為空,則輸出一個整數,表示從隊頭彈出的數。否則不進行任何操作。
Sample Input
8
3
4
0
-1
-1
-1
-1
1
Sample Output
4
3
4
3
Tip
對於50%的資料,1≤N≤1000
對於100%的資料,1≤N≤106,-1≤x≤109。
觀察此題,我們可以知道,這是一道簡單的模擬題,題目要求我們建出一個佇列,並且包含向後複製這個佇列,向前插入數,輸出並刪除第一個數這三個操作。
那麼,我們就可以直接模擬出這道題的情況。
但是,我們考慮到,如果題目不斷的複製後面的佇列,將會導致我們所需要的時間過長。
所以,我們認真觀察資料,發現N的範圍在[1,106]內,那麼,也就是說,最壞的情況,題目要求我們一直輸出,也只能輸出106個數。所以,我們的佇列如果長度超過106,那麼,後面的部分都可以捨棄,不需要再向後新增數。所以,我們得到如下的程式碼。
#include <cstdio> using namespace std; const int maxn=1000050; int x[maxn<<1]; int head=maxn+1,tail=maxn; int n,a; inline int read() { int f=0,x=0;char c=getchar(); while (((c<'0')||(c>'9'))&&(c!='-')) c=getchar(); if (c=='-') c=getchar(),f=1; while ((c>='0')&&(c<='9')) x=(x<<3)+(x<<1)+c-'0',c=getchar(); return f?-x:x; } int main() { n=read(); while (n--) { a=read(); switch (a) { case -1: if (head<=tail) printf("%d\n",x[head++]); break; case 0: for (int t=tail,q=head;((tail-1)<=(maxn<<1))&&(tail-head+51<=maxn)&&q<=t;q++) x[++tail]=x[q]; break; default: x[--head]=a; } } return 0; }