【队列】【懒排序】队列Q

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

posted @ 2024-10-19 01:03  peterzh6  阅读(7)  评论(0编辑  收藏  举报