佇列Q(Wannafly挑戰賽19)
阿新 • • 發佈:2018-12-20
題目描述
ZZT 創造了一個佇列 Q。這個佇列包含了 N 個元素,佇列中的第 i 個元素用 Qi 表示。Q1 表示隊頭元素,QN 表示隊尾元素。佇列中的元素是 N 的一個全排列。 ZZT 需要在這個佇列上執行 P 次操作,操作分兩種: FIRST X: 將元素 X 移到隊頭。 LAST X: 將元素 X 移到隊尾。 在 P 次操作之後,ZZT 想知道佇列中的元素的排列方式,由於他最近很忙,因此需要請你幫他解決這個問題。
輸入描述:
第一行輸入一個正整數 N,表示佇列的大小。 第二行輸入 N 個正整數,Q1, Q2, Q3, ... ..., QN,Qi 表示佇列中的第 i 個元素。保證這 N 個數是 N 的一個全排列。 第三行輸入一個正整數 P,表示接下來要進行的操作次數。
接下來 P 行,第 i 行輸入一個字串 Si 以及一個正整數 Xi,表示一次操作。
1 ≤ N ≤ 105. 1 ≤ Qi ≤ N. 1 ≤ P ≤ 105. Si { “FIRST”, “LAST” }. 1 ≤ Xi ≤ 105.
輸出描述:
輸出 N 個正整數,表示 P 次操作之後的佇列。
示例1
輸入
4 4 2 1 3 3 FIRST 4 LAST 2 LAST 1
輸出
4 3 2 1
思路: 寫入陣列的時候按順序標記下標,根據操作更改下標值,最後按照下標升序對輸入陣列排序。
AC程式碼:
#include <iostream> #include <bits/stdc++.h> #include <cstring> using namespace std; const int maxn=1e5+10; int a[maxn]; int pos[maxn*2]; bool cmp(int i,int j){ return pos[i]<pos[j]; } int main(){ int n; cin>>n; for(int i=1;i<=n;i++){ cin>>a[i]; pos[a[i]]=i; } int l=1,r=n; int q; cin>>q; while(q--){ int x; string op; cin>>op; cin>>x; if(op[0]=='F'){ pos[x]=--l; } else{ pos[x]=++r; } } sort(a+1,a+1+n,cmp); for(int i=1;i<=n;i++) cout<<a[i]<<" "; return 0; }