题目描述
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
思路:用结构体保存值和下标,对每一个操作修改对应的下标就行了,输出时再排一下序即可。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+5;
inline int read()
{
int ret = 0; char c;
for(c = getchar(); c < '0' || c > '9'; c = getchar());
for(; c >= '0' && c <= '9'; c = getchar()) ret = ret * 10 + c - '0';
return ret;
}
struct node{int v, id;} p[maxn];
bool cmp(node a, node b){ return a.id < b.id;}
string s;
int main()
{
int n, x, y; n = read();
for(int i = 1; i <= n; i++)
{
int x = read();
p[x].v = x; p[x].id = i;
}
int m,l = 0, r = n + 1; m = read();
while(m--)
{
cin >> s; int x = read();
if(s == "FIRST") p[x].id = l--;
else p[x].id = r++;
}
sort(p+1,p+n+1,cmp);
for (int i = 1; i <= n; i++) printf("%d%c",p[i].v,i == n?'\n':' ');
}