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 双向排序模拟的主要内容,如果未能解决你的问题,请参考以下文章

sql 升序降序排列

Angular 表中的排序方向和顺序(升序、降序)

oracle 默认是升序还是降序

sql查询降序和升序的问题

MYSQL 按升序和降序排序

Laravel 按分页降序或升序排序