LQ0137 双向排序模拟
Posted 海岛Blog
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LQ0137 双向排序模拟相关的知识,希望对你有一定的参考价值。
题目来源:蓝桥杯2021初赛 C++ B组J题
题目描述
给定序列(a[1], a[2], … , a[n]) = (1, 2, … , n),即a[i] = i。
小蓝将对这个序列进行m次操作,每次可能是将a[1], a[2], … a[qi] 降序排列,或者将a[qi], a[qi+1], … , a[n] 升序排列。
请求出操作完成后的序列。
输入格式
输入的第一行包含两个整数n, m,分别表示序列的长度和操作次数。
接下来m行描述对序列的操作,其中第i行包含两个整数pi, qi 表示操作类型和参数。
当pi = 0 时,表示将a[1], a[2], … a[qi] 降序排列;当pi = 1 时,表示将a[qi], a[qi+1], … , a[n] 升序排列升序排列。
对于30% 的评测用例,n,m ≤ 1000;
对于60% 的评测用例,n,m ≤ 5000;
对于所有评测用例,1 ≤ n,m ≤ 100000, 0 ≤ ai ≤ 1,1 ≤ bi ≤ n。
输出格式
输出一行,包含n个整数,相邻的整数之间使用一个空格分隔,表示操作完成后的序列。
输入样例
3 3
0 3
1 2
0 2
输出样例
3 1 2
问题分析
(略)
AC的C++语言程序如下:
/* LQ0137 双向排序 */
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100000 + 1;
pair<int, int> a[N];
int ans[N];
int main()
int n, m, pi, qi, cnx = 0;
cin >> n >> m;
while (m--)
cin >> pi >> qi;
if (pi == 0)
while(cnx && a[cnx].first == 0)
qi = max(qi, a[cnx--].second);
while (cnx >= 2 && a[cnx - 1].second <= qi)
cnx -= 2;
a[++cnx] = 0, qi;
else if (cnx)
while(cnx && a[cnx].first == 1)
qi = min(qi, a[cnx--].second);
while (cnx >= 2 && a[cnx - 1].second >= qi)
cnx -= 2;
a[++cnx] = 1, qi;
int l = 1, r = n, k = n;
for (int i = 1; i <= cnx; i++)
if (a[i].first == 0)
while (l <= r && r > a[i].second)
ans[r--] = k--;
else
while (l <= r && l < a[i].second)
ans[l++] = k--;
if (l > r) break;
if (cnx % 2)
while (l <= r)
ans[l++] = k--;
else
while (l <= r)
ans[r--] = k--;
for (int i = 1; i <= n; i++)
printf("%d ", ans[i]);
return 0;
以上是关于LQ0137 双向排序模拟的主要内容,如果未能解决你的问题,请参考以下文章