列表

详情


NC17059. 队列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.
S { “FIRST”, “LAST” }.
1 ≤ Xi ≤ 105.

输出描述

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

示例1

输入:

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

输出:

4 3 2 1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 89ms, 内存消耗: 1784K, 提交时间: 2022-05-30 09:10:00

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
int a[N],p[N];
bool cmp(int a,int b){
	return p[a]<p[b];
}
int main(){
	int n,m,x;
	string op;
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		p[a[i]]=i;
	}
	cin>>m;
	int l=0,r=n+1;
	while(m--){
		cin>>op>>x;
		if(op=="FIRST"){
			p[x]=l--;
		}
		else{
			p[x]=r++;
		}
	}
	sort(a+1,a+n+1,cmp);
	for(int i=1;i<=n;i++)
	cout<<a[i]<<' ';
	
}

Python3(3.5.2) 解法, 执行用时: 631ms, 内存消耗: 42724K, 提交时间: 2018-07-06 19:14:43

n = int(input())
a = list(map(int, input().split()))
m = int(input())
b = [input().split() for i in range(m)]
c = [0] * n
d = [0] * n
l, r = 0, -1
for e in b[::-1]:
	if d[int(e[1]) - 1]:
		continue
	else:
		d[int(e[1]) - 1] = 1
		if e[0] == 'FIRST':
			c[l] = int(e[1])
			l += 1
		else:
			c[r] = int(e[1])
			r -= 1
for i in range(n):
	if d[a[i] - 1] == 0:
		c[l] = a[i]
		l += 1
print(*c)

上一题