[ARC125C] LIS to Original Sequence

首先考虑 k=1,唯一的方案就是倒序输出 1n

我们可以想到,这道题的方法是向已经确定的序列 A 中插入其他数。

对于一个数 x(x<Ai),是不能把它放在 Ai 前的,不然会使最长上升子序列的长度变大。

为了保证字典序最小,我们得把能放在 Ai 后的最小的数放它后边。

最后要特殊处理 Ak,把剩下没有加入答案序列的部分倒序输出。

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

const int N = 200500;

int n,k;
int a[N],t[N];

int main() {
    cin >> n >> k;
    for(int i = 1;i <= k; i++) {
        cin >> a[i];
        t[a[i]] ++;
    }
    if(k == 1) {
        for(int i = n;i >= 1; i--)
			cout << i << " ";
        return 0;
    }
    
    int cur = 1;
    while(cur <= n && t[cur])
        cur ++;
    
    for(int i = 1;i < k; i++) {
        cout << a[i] << " ";

        if(cur < a[i]) {
            t[cur] ++;
            cout << cur << " ";
            cur ++;
        }

        while(cur <= n && t[cur])
            cur ++;
    }

    for(int i = n; i >= 1; i--) {
        if(!t[i] || i == a[k])
            cout << i << " ";
    }
    return 0;
}

作者:白简

出处:https://www.cnblogs.com/baijian0212/p/solution-at-arc125-c.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   -白简-  阅读(13)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
点击右上角即可分享
微信分享提示
more_horiz
keyboard_arrow_up dark_mode palette
选择主题