蓝桥杯,历届真题 双向排序

 

 

 

#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),第二个使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值