bzoj1046 [HAOI2007]上升序列

来源:互联网 发布:红蜘蛛软件彻底卸载 编辑:程序博客网 时间:2024/06/05 10:57

题意

对于一个给定的S=a1,a2,a3,,an,若有P=ax1,ax2,ax3,,axm,满足(x1<x2<<xm)且(ax1<ax2<<axm)。那么就称P为S的一个上升序列。如果有多个P满足条件,那么我们想求字典序最小的那个。任务给出S序列,给出若干询问。对于第i个询问,求出长度为Li的上升序列,如有多个,求出字典序最小的那个(即首先x1最小,如果不唯一,再看x2最小……),如果不存在长度为Li的上升序列,则打印Impossible.

题解

傻逼题。LIS搞。输出贪心。
其实这份代码会PE

#include<set>#include<queue>#include<cstdio>#include<vector>#include<cstring>#include<iostream>#include<algorithm>using namespace std;inline int read() {    int x = 0, flag = 1; char ch = getchar();    while (ch > '9' || ch < '0') { if (ch == '-') flag = -1; ch = getchar(); }    while (ch <= '9' && ch >= '0') { x = x * 10 + ch - '0'; ch = getchar(); }    return x * flag;}#define rep(ii, aa, bb) for (int ii = aa; ii <= bb; ii++)#define drp(ii, aa, bb) for (int ii = aa; ii >= bb; ii--)#define ll long long#define N 10001int a[N], f[N];int main() {    int n = read(), maxL = 1;    rep(i, 1, n) a[i] = read(), f[i] = 1;    drp(i, n, 1) drp(j, n, i + 1) if (a[j] > a[i]) maxL = max(maxL, (f[i] = max(f[i], f[j] + 1)));    int q = read();    while (q--) {        int L = read();        if (L > maxL) { puts("Impossible\n"); continue; }        int mn = 0;        rep(i, 1, n) if (f[i] >= L && a[i] > mn) {            printf("%d", a[i]); if (L != 1) printf(" ");            mn = a[i];  if (--L == 0) break;        }        printf("\n");    }    return 0;}
原创粉丝点击