bzoj1046 [HAOI2007]上升序列

题意

对于一个给定的\(S={a1,a2,a3,…,an}\),若有\(P={ax1,ax2,ax3,…,axm}\),满足(\(x1 < x2 < … < xm\))且(\(ax1 < ax 2 < … < 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 10001

int 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;
}
posted @ 2018-02-05 09:14  aziint  阅读(114)  评论(0编辑  收藏  举报
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial 4.0 International License.