【队列】【懒排序】队列Q
https://ac.nowcoder.com/acm/contest/22669/L
要点:
-
利用pos实现懒排序,用另外一个数组记录被移动的元素现在的理论位置,而不进行物理操作。最后再排序
-
利用l和r标志标记最小的元素的索引。注意,这里l和r用的是相对位置,所以没有实际含义,只是表示哪个元素在哪个元素的前面或者后面。那么为什么要这个标志呢?试想,现在我们用pos记录元素的位置,进行懒排序,不改变物理位置,那么怎么知道第一个元素是哪个呢,所以需要记录l,同理,也需要记录r
-
边界问题。l和r不应该影响未被移动的数组元素。即l和r的初始值需要注意,应该超出数组索引的范围,否则会和数组的原来的顺序碰撞,引发testcase不过。
#include<bits/stdc++.h>
using namespace std;
int a[100001];
int pos[100001];
bool compare(int a, int b) {
return pos[a] < pos[b];
}
int main() {
int n, p;
scanf("%d", &n);
for(int i=0;i<n;i++) {
scanf("%d", &a[i]);
pos[a[i]] = i;
}
scanf("%d", &p);
int l = -1, r = n + 1;
while(p--) {
string op;
int num;
cin >> op;
scanf("%d", &num);
if(op == "FIRST") {
pos[num] = l;
l--;
} else {
pos[num] = r;
r++;
}
}
sort(a, a+n, compare);
for(int i=0;i<n;i++) {
printf("%d", a[i]);
if(i != n-1) {
printf(" ");
} else {
printf("\n");
}
}
return 0;
}