ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NC17059 队列Q

2022-07-02 17:03:08  阅读:152  来源: 互联网

标签:NC17059 正整数 vis 队列 元素 int 操作


NC17059 队列Q

题目

题目描述

ZZT 创造了一个队列 Q。这个队列包含了 N 个元素,队列中的第 i 个元素用 \(Q_i\) 表示。Q1 表示队头元素,\(Q_N\) 表示队尾元素。队列中的元素是 N 的一个全排列。

ZZT 需要在这个队列上执行 P 次操作,操作分两种:
FIRST X: 将元素 X 移到队头。
LAST X: 将元素 X 移到队尾。

在 P 次操作之后,ZZT 想知道队列中的元素的排列方式,由于他最近很忙,因此需要请你帮他解决这个问题。

输入描述

第一行输入一个正整数 N,表示队列的大小。
第二行输入 N 个正整数,\(Q_1, Q_2, Q_3, ... ..., Q_N\),\(Q_i\) 表示队列中的第 i 个元素。保证这 N 个数是 N 的一个全排列。
第三行输入一个正整数 P,表示接下来要进行的操作次数。

接下来 P 行,第 i 行输入一个字符串 \(S_i\) 以及一个正整数 \(X_i\),表示一次操作。
\(1 ≤ N ≤ 10_5\).
\(1 ≤ Q_i ≤ N\).
\(1 ≤ P ≤ 10^5\).
\(S_i\in\) { “FIRST”, “LAST” }.
\(1 ≤ X_i ≤ 10^5\).

输出描述

输出 N 个正整数,表示 P 次操作之后的队列。

示例1

输入

4
4 2 1 3
3
FIRST 4
LAST 2
LAST 1

输出

4 3 2 1

题解

思路

知识点:队列。

如果是没操作过的原序列的元素,相对位置不会改变,而操作过的元素绝对不会出现在没操作过的元素中间,因为每次都是往队列两端插入,不可能到中间。

一个元素的最终位置,取决于最后一次操作的时间和操作方式,因为最后一次操作产生的位置不会被之前所有操作以及其他元素除了最后一次操作之外的操作影响。并且最后操作时间早的元素先确定位置。

因此保存每个时间操作的元素 \(xi\) 和方式 \(opi\) 以及每个元素最后的操作时间 \(vis\) 。从小到大遍历时间 \(i\) ,若 \(vis[xi[i]] = i\) ,即这个时间就是这个元素最后操作的时间,根据操作 \(opi[i]\) ,结合 \(deque\) 进行操作,最后输出即可。

时间复杂度 \(O(n+p)\)

空间复杂度 \(O(n)\)

代码

#include <bits/stdc++.h>

using namespace std;

int a[100007];
int vis[100007], xi[100007], opi[100007];
deque<int> dq;

///元素位置由最后一次操作决定
int main() {
    std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
    int n;
    cin >> n;
    for (int i = 0;i < n;i++) cin >> a[i];
    int p;
    cin >> p;
    for (int i = 1;i <= p;i++) {
        string op;
        int x;
        cin >> op >> x;
        vis[x] = i;
        xi[i] = x;
        opi[i] = op == "FIRST";
    }

    for (int i = 0;i < n;i++) {
        if (!vis[a[i]]) dq.push_back(a[i]);
    }

    for (int i = 1;i <= p;i++) {
        if (vis[xi[i]] == i) {
            if (opi[i]) dq.push_front(xi[i]);
            else dq.push_back(xi[i]);
        }
    }
    for (int i = 0;i < n;i++) cout << dq[i] << ' ';
    cout << '\n';
    return 0;
}

标签:NC17059,正整数,vis,队列,元素,int,操作
来源: https://www.cnblogs.com/BlankYang/p/16437911.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有