[HAOI2007]上升序列
发布日期:2021-08-21 13:17:54 浏览次数:37 分类:技术文章

本文共 1026 字,大约阅读时间需要 3 分钟。

Description

Solution

一开始看成了是子序列的字典序最小,实际上是位置的字典序最小

先跑一边LIS,然后贪心的选最靠前的LIS够长的序列就行。

Code

由于一开始看错了,代码有点冗余。

const int N = 10010;int a[N], f[N], p[N], g[N], n;void main() {    n = read();    for (int i = 1; i <= n; ++i) a[i] = read();    memset(g, 0x3f, sizeof g);    for (int i = n; i; --i) {        for (int j = i + 1; j <= n; ++j)            if (a[j] > a[i]) {                if (f[j] > f[i]) f[i] = f[j], p[i] = j;            }        f[i]++;        g[f[i]] = i;    }    for (int i = n; i; --i) {        if (g[i] > g[i + 1]) g[i] = g[i + 1];    }    int q = read();    while (q--) {        int x = read();        if (x > n || g[x] == 0x3f3f3f3f)            puts("Impossible");        else {            for (int i = 1, last = 0, j = 1; i <= n && j <= x; ++i)                if (a[i] > last && f[i] >= x - j + 1) {                    printf("%d ", a[i]);                    j++;                    last = a[i];                }            puts("");        }    }}

Note

要看清题啊!!!!

转载于:https://www.cnblogs.com/wyxwyx/p/bzoj1046.html

转载地址:https://blog.csdn.net/weixin_33720078/article/details/93684072 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:如何实现在已有代码之后添加逻辑之继承,组合(静态代理)实现方法
下一篇:剑指Offer:第一个只出现一次的字符

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2024年04月12日 08时50分26秒