题意:对于给定的一列数,根据输入顺序对前 x 个数进行小于等于或大于等于的排序。
加入分别需要排前 2,3,4 个数,那么保留 4 就可以,2 和 3 的排序对结果没有影响。所以最后需要把输入变成一个递减序列,如输入是 2 3 4 2 7 6 ,那么最后只要按照 7 6 的顺序排序就可以。
得到递减序列后,排序也可以优化。以上面数据为例,再用一个新的数组 b 将前 7 个数从小到大排序,用 bl 和 br 分别代表区间的最小值和最大值,通过移动 bl、br 就可以一遍完成所有排序。
#include<cstring>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<string>
#include<iostream>
#include<algorithm>
using namespace std;
int a[200005], t[200005]; //分别代表最终的递减序列和其query(1或2)
int n, m;
int num[200005]; //输入的数据
int b[200005]; //需要排序的前x个数从小到大的排序
int len; //最终递减序列长度
int main(){
//freopen("a.txt", "r", stdin);
while(scanf("%d%d", &n, &m) != EOF){
for(int i = 1; i <= n; i++){
scanf("%d", &num[i]);
b[i] = num[i];
}
int len = 1, x, y;
a[0] = 0;
for(int i = 1; i <= m; i++){
scanf("%d%d", &t[i], &y);
while(len>1 && y>=a[len-1])
len--;
a[len] = y;
t[len++] = t[i];
}
int bl = 1, br = a[1];
sort(b+1, b+1+br);
num[0] = 0;
a[len] = 0;
for(int i = 1; i < len; i++){
for(int j = a[i]; j > a[i+1]; j--){
if(t[i] == 1){
num[j] = b[br--];
}else{
num[j] = b[bl++];
}
}
}
for(int i = 1; i <= n; i++){
cout << num[i];
if(i!=n) cout << " ";
}
cout << endl;
}
return 0;
}