蓝桥杯每日一题2023.10.4

双向排序 - 蓝桥云课 (lanqiao.cn)

题目描述

题目分析

六十分解法如下:按照题意简单排序

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, p, q, a[N];
bool cmp(int x, int y)
{
	return x > y;
}
int main()
{
	cin >> n >> m;
	for(int i = 1; i <= n; i ++)a[i] = i;
	for(int i = 1; i <= m; i ++)
	{
		cin >> p >> q;
		if(p == 0)sort(a + 1, a + 1 + q, cmp);
		else sort(a + q, a + 1 + n);
	}
	for(int i = 1; i <= n; i ++)cout << a[i] << ' ';
	return 0;
}

满分解法:

对于每一次操作我们在每次连续的升序和降序操作中只需要选呢个范围最大的即可,范围小的操作对于范围大的操作相当于重复没用的操作,因此我们正真需要的操作是升序降序依次交替出现的,第一个有效操作一定为p = 0,因为刚开始一定是升序的,再进行升序操作是无效操作

在排序中会不断有数字被固定

由于升降交替排序,先将1, x降序排序,再将y, n升序排序,这里y <= x,我们可以发现x, n这段会被固定而不发生变化

同理,先将x, n升序排序,再将1, y降序排序,这里y <= x,我们可以发现1, y这段会被固定而不发生变化

使用ans不断记录被固定的数,最后没固定的再看其操作,

由于第一个有效操作一定是p = 0,故如果剩余的操作次数为奇数相当于降序操作确定了x, n的位置,如果为偶数个操作次数就相当于后缀做升序,就意味着确定前缀1, y的位置

cpp 复制代码
#include<bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
pair<int, int> stk[N];
int n, m, top, p, q, ans[N];
int main()
{
	cin >> n >> m;
	while(m --)
	{
		cin >> p >> q;
		if(p == 0)
		{
			while(top && stk[top].first == 0)
			{
				q = max(q, stk[top --].second);
			}

			//123456
			//321456
			//432156
			while(top >= 2 && stk[top - 1].second <= q)
			{//如上,如果当前操作比上一次相同操作的范围大,那此次操作的前两次操作都将被无效化 
				top -= 2;
			}
			stk[++top] = {0, q}; 
		}
		else if(top)
		{
			while(top && stk[top].first == 1)
			{
				q = min(q, stk[top --].second);
			}
			while(top >= 2 && stk[top - 1].second >= q)
			{
				top -= 2;
			}
			stk[++ top] = {1, q};
		}
	}
	int left = 1, right = n, k = n;
	for(int i = 1; i <= top; i ++)
	{
		if(stk[i].first == 0)
		{
			while(right > stk[i].second && left <= right)//确定[x, n] 
			{
				ans[right --] = k --;
			}
		}
		else
		{
			while(left < stk[i].second && left <= right)//确定[1, y] 
			{
				ans[left ++] = k --;
			}
		}
		if(left > right)break;
	}
	if(top % 2)
	{
		while(left <= right)ans[left ++] = k --;
	}
	else
	{
		while(left <= right)ans[right --] = k --;
	}
	for(int i = 1; i <= n; i ++)
	{
		cout << ans[i] << ' ';
	}
	return 0;
}
相关推荐
h_a_o777oah14 分钟前
2026 蓝桥杯软件 C++B组 国赛比赛经历及备赛建议
c++·经验分享·算法·蓝桥杯
酉鬼女又兒17 分钟前
零基础入门计算机网络:点对点协议PPP、媒体接入控制基本概念、静态划分信道技术、CSMA/CD与CSMA/CA协议全面详解
服务器·网络·网络协议·计算机网络·职场和发展·求职招聘·媒体
酉鬼女又兒27 分钟前
零基础快速入门IP编址计算练习题详解:从基础到实战
网络·网络协议·tcp/ip·计算机网络·考研·职场和发展·分类
8Qi811 小时前
LeetCode 494:目标和(Target Sum)—— 题解 ✅
算法·leetcode·职场和发展·动态规划·01背包
这料鬼有毒14 小时前
二刷hot100-78.子集
算法·leetcode·职场和发展
li星野16 小时前
FAISS 详解:原理、使用与面试指南——向量检索的基石
面试·职场和发展·faiss
mifengxing16 小时前
LeetCode热题100——字母异位词分组
java·算法·leetcode·职场和发展·哈希表·hot100
I Promise3418 小时前
智驾APA_HPA可行驶区域检测算法工程师面试问题整理可参考
算法·面试·职场和发展
迈巴赫车主19 小时前
蓝桥杯21241灯塔java
java·开发语言·数据结构·算法·职场和发展·蓝桥杯·动态规划
酉鬼女又兒19 小时前
零基础入门计算机网络可靠传输:从基本概念到三大实现机制(停止 - 等待 / 回退 N 帧 / 选择重传)全解析
网络·网络协议·计算机网络·考研·职场和发展·计算机外设·求职招聘