【佇列】【懶排序】佇列Q

peterzh6發表於2024-10-19

https://ac.nowcoder.com/acm/contest/22669/L

要點:

  1. 利用pos實現懶排序,用另外一個陣列記錄被移動的元素現在的理論位置,而不進行物理操作。最後再排序

  2. 利用l和r標誌標記最小的元素的索引。注意,這裡l和r用的是相對位置,所以沒有實際含義,只是表示哪個元素在哪個元素的前面或者後面。那麼為什麼要這個標誌呢?試想,現在我們用pos記錄元素的位置,進行懶排序,不改變物理位置,那麼怎麼知道第一個元素是哪個呢,所以需要記錄l,同理,也需要記錄r

  3. 邊界問題。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;
}

相關文章