#include <iostream>
using namespace std;
const int N = 100010;
pair<int, int> sk[N]; //struct型,结构体,模板
int arr[N];
int main() {
ios::sync_with_stdio(false); //加快输入输出,速度起码提升两倍
int n, m, top = 0; //记录顶部位置
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int p, q;
cin >> p >> q;
if (p == 0) {
while (top && sk[top].first == 0) {
q = max(q, sk[top--].second);
}
while (top >= 2 && sk[top - 1].second <= q) {
top -= 2;
}
sk[++top] = { 0,q };
}
else if (top) {
while (sk[top].first == 1) {
q = min(q, sk[top--].second);
}
while (top >= 2 && sk[top - 1].second >= q) {
top -= 2;
}
sk[++top] = { 1,q };
}
}
int left = 1, right = n, k = n;
for (int i = 1; i <= top; i++) {
if (sk[i].first == 0) {
while (right > sk[i].second && left <= right) { //left<=right是关键,
//怕排序完后k继续减,出现负值
arr[right--] = k--;
}
}
else {
while (left < sk[i].second && left <= right) {//left<=right是关键
arr[left++] = k--;
}
}
if(left > right) break; //结束标志
}
//若未全部遍历,继续遍历
if(top % 2 == 1){
//top在0处
while(left <= right){
arr[left++] = k--;
}
}else{
//top在1处
while(left <= right){
arr[right--] = k--;
}
}
for (int i = 1; i <= n; i++) {
cout << arr[i] << " ";
}
return 0;
}
关于ios::sync_with_stdio(false)函数的运用,运行时间差距如下图:
第一个未使用ios::sync_with_stdio(false),第二个使用。