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;
}