zoukankan      html  css  js  c++  java
  • 队列Q(Wannafly挑战赛19)

    链接: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, 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 arr[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>>arr[i];
            pos[arr[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(arr+1,arr+1+n,cmp);
    
        for(int i=1;i<=n;i++)
            cout<<arr[i]<<" ";
        return 0;
    }
    
  • 相关阅读:
    ios7 苹果原生二维码扫描(和微信类似)
    ios7之后 根据UILabel的文字计算frame的方法
    [Luogu1944] 最长括号匹配
    [bzoj3916] friends
    [NOIp2006] 能量项链
    [NOIp2003] 加分二叉树
    [Luogu1353] 跑步Running
    [Luogu2214] Mooo Moo S
    [POJ2452] Sticks Problem
    [POJ2406] Power Strings
  • 原文地址:https://www.cnblogs.com/UUUUh/p/10284025.html
Copyright © 2011-2022 走看看