• 队列Q(排序方式)


    链接:https://ac.nowcoder.com/acm/contest/131/A
    来源:牛客网

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

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

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

    输入描述:

    第一行输入一个正整数 N,表示队列的大小。
    第二行输入 N 个正整数,Q1, Q

    2

    , Q

    3

    , ... ..., Q

    N

    ,Q

    i

    表示队列中的第 i 个元素。保证这 N 个数是 N 的一个全排列。
    第三行输入一个正整数 P,表示接下来要进行的操作次数。
    接下来 P 行,第 i 行输入一个字符串 Si 以及一个正整数 Xi,表示一次操作。
    1 ≤ N ≤ 105.
    1 ≤ Qi ≤ N.
    1 ≤ P ≤ 105.
    S∈in∈ { “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<iostream>
    #include<algorithm>
    using namespace std;
    const int maxn=1e6+100;
    int n; 
    int a[maxn];
    int vis[maxn];
    bool cmp(int a,int b){
        return vis[a]<vis[b];
    }
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            vis[a[i]]=i;
        } 
        int m;
        cin>>m;
        int l=1,r=n;
        for(int i=1;i<=m;i++){
            string a;
            int x;
            cin>>a>>x;
            if(a=="FIRST"){
                l--;
                vis[x]=l;
            }
            else{
                r++;
                vis[x]=r;
            }
        }
        sort(a+1,a+n+1,cmp);
        for(int i=1;i<=n;i++){
            printf("%d ",a[i]);
        }
        cout<<endl;
    }
  • 相关阅读:
    Java知识回顾 (8) 集合
    Java知识回顾 (7) 继承、多态与接口、封装
    使用LEANGOO泳道
    使用列表
    LEANGOO用户设置
    创建LEANGOO项目
    为看板添加成员
    创建看板卡片
    创建LEANGOO看板
    创建LEANGOO账号
  • 原文地址:https://www.cnblogs.com/lipu123/p/14552384.html
Copyright © 2020-2023  润新知