Wannafly挑战赛19-队列Q(模拟)

题目描述 

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':' ');
}

猜你喜欢

转载自blog.csdn.net/sugarbliss/article/details/81188217
今日推荐