zzt 創造了乙個佇列 q。這個佇列包含了 n 個元素,佇列中的第 i 個元素用 qi 表示。q1 表示隊頭元素,qn 表示隊尾元素。佇列中的元素是 n 的乙個全排列。
zzt 需要在這個佇列上執行 p 次操作,操作分兩種:
first x: 將元素 x 移到隊頭。
last x: 將元素 x 移到隊尾。
在 p 次操作之後,zzt 想知道佇列中的元素的排列方式,由於他最近很忙,因此需要請你幫他解決這個問題。
第一行輸入乙個正整數 n,表示佇列的大小。1第二行輸入 n 個正整數,q
, q2
, q3
, ... ..., qn
,qi
表示佇列中的第 i 個元素。保證這 n 個數是 n 的乙個全排列。接下來 p 行,第 i 行輸入乙個字串 si 以及乙個正整數 xi,表示一次操作。第三行輸入乙個正整數 p,表示接下來要進行的操作次數。
1 ≤ n ≤ 105.
1 ≤ qi ≤ n.
1 ≤ p ≤ 105.
si.1 ≤ xi ≤ 105.
輸出 n 個正整數,表示 p 次操作之後的佇列。示例1
複製
4複製4 2 1 3
3first 4
last 2
last 1
4 3 2 1題意:中文題很明了了,要求對一長度為n的=佇列進行m次操作,將指定元素插在隊頭或者隊尾
題解:我們用兩個陣列進行儲存和乙個set容器進行操作
先將資料和操作分別讀入
因為我們可以知道,操作從前往後會將資料不斷的往佇列裡面壓縮,所以我們將操作存起來倒著操作
這樣就可以保證元素的順序
用set容器來維護,確保臨時陣列b中沒有重複元素出現
**如下
#includeusingview codenamespace
std;
#define ll long long
const
int maxn=1e5+5
;int
a[maxn], b[maxn];
sets;
char ins[maxn][10
];int
v[maxn];
intmain()
int head=0, tail=n-1
;
//從0開始的頭部操作和從n-1開始的尾部操作,分別插入
//tips:操作完後b陣列中可能有空的位置沒有被佔據
for(int i=m-1;i>=0;i--)
s.insert(val);
if(ins[i][0]=='f'
)else
}//我們將a中沒有插入到b中的陣列插入到b中
for(int i=0;i)
if(!s.count(a[i]))
head=0
;
//重新插入覆蓋,保證佇列的完整性
for(int i=0;i)
if(b[i]!=0
)
//格式要求很重要
for(int i=0;i)
printf(
"%d%c
", a[i], i==n-1?'
\n':'');
return0;
}
牛客Wannafly 挑戰賽19 A 佇列Q
zzt 創造了乙個佇列 q。這個佇列包含了 n 個元素,佇列中的第 i 個元素用 q i 表示。q 1 表示隊頭元素,q n 表示隊尾元素。佇列中的元素是 n 的乙個全排列。zzt 需要在這個佇列上執行 p 次操作,操作分兩種 first x 將元素 x 移到隊頭。last x 將元素 x 移到隊尾...
牛客Wannafly挑戰賽12 題解
傳送門 說是比賽題解,其實我只會前三題 後面的一定補 t1題意,在乙個長度為n的時間內,問如何選擇存款期限,使得收益最大。dp include include include include using namespace std define fi first define se second d...
牛客網 Wannafly挑戰賽21 A 燈塔
題目鏈結 題目描述 z市是一座港口城市,來來往往的船隻依靠燈塔指引方向。在海平面上,存在n個燈塔。每個燈塔可以照亮以它的中心點為中心的90 範圍。特別地,由於特殊限制,每個燈塔照亮範圍的角的兩條邊必須要麼與座標軸平行要麼與座標軸成45 由於經費限制,z市的燈塔只能被點亮一座。你需要求出在這種情況下,...