1. 程式人生 > >佇列Q(Wannafly挑戰賽19)

佇列Q(Wannafly挑戰賽19)

題目描述

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;
}