题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1046
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <string.h>
#include <queue>
#include <vector>
#include <algorithm>
#include <cassert>
#include <set>
#include <map>
#include <cmath>
#include <ctime>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<(b);++i)
#define rrep(i,a,b) for(int i=(a);i>=(b);--i)
#define clr(a,x) memset(a,(x),sizeof(a))
#define eps 1e-8
#define LL long long
#define mp make_pair
const int maxn=100000+5;
int A[maxn];
int S[maxn],len,dp[maxn],maxlen;
int ans[maxn];
int n;
void output(int L)
{
int sz=0,pre=1<<31;
rep(i,1,n+1) {
if(dp[i]>=L&&pre<A[i]) {
--L; ans[sz++]=A[i];
pre=A[i];
}
if(L==0) break;
}
}
int main()
{
while(scanf("%d",&n)==1) {
rep(i,1,n+1) scanf("%d",A+i);
len=0;
rrep(i,n,1) {
int j=lower_bound(S,S+len,-A[i])-S;
dp[i]=j+1;
if(j==len) ++len;
S[j]=-A[i];
}
int m; scanf("%d",&m);
while(m--) {
int l; scanf("%d",&l);
if(len<l) { puts("Impossible"); continue; }
output(l); printf("%d",ans[0]);
rep(i,1,l) printf(" %d",ans[i]);
puts("");
}
}
}