[蓝桥杯2020国赛]游园安排

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[蓝桥杯2020国赛]游园安排相关的知识,希望对你有一定的参考价值。

题目:

在这里插入图片描述

题解:

本质就是求最长上升子序列,只不过这里是字符串版本的,我们都知道有n^2的LIS,但其实还有O(nlogn)版本的,详细看这里,套上就行
另外我发现这里竟然有蓝桥杯全套的编程题离谱,贴上本题地址

代码:

#include <iostream>
#include<algorithm>
#include<cstring>
#include<string>
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6;
string a[maxn];
string b[maxn];
int pos[maxn], ans[maxn];
int main()
{
    string s;
    cin >> s;
    int cnt = 0;
    for (int i = 0; i < s.size(); i++) {
        if (s[i] >= 'A' && s[i] <= 'Z') a[++cnt] = s[i];
        else a[cnt] += s[i];
    }
    int len = 1;
    b[1] = a[1];
    pos[1] = len;
    for (int i = 2; i <= cnt; i++) {
        if (a[i]>b[len]) {//a大于b
            b[++len] = a[i];//加入b
            pos[i] = len;//a中第i个数在b中的位置
        }
        else {
            int id = lower_bound(b + 1, b + 1 + len, a[i]) - b;//找到b中大于a[i]的第一个位置
            b[id] = a[i];//该位置用当前a替换
            pos[i] = id;
        }
    }
    int tmp = len;
    string maxx = "Zzzzzzzzzz";
    for (int i = cnt; i >= 1; i--) {
        if (!tmp)break;
        if (pos[i] == tmp && maxx>a[i]) {
            ans[tmp] = i;
            --tmp;
            maxx = a[i];
        }
    }
    for (int i = 1; i <= len; i++) {
        cout << a[ans[i]];
    }
    cout << endl;

    return 0;
}

以上是关于[蓝桥杯2020国赛]游园安排的主要内容,如果未能解决你的问题,请参考以下文章

蓝桥杯国赛--游园安排

蓝桥杯国赛游园安排

蓝桥杯国赛游园安排

蓝桥杯国赛游园安排

第十一届蓝桥杯(国赛)——游园安排

第十一届蓝桥杯(国赛)——游园安排