反向dp f[i]表示从n到i的最长不上升序列长度 打印的时候直接扫一遍就可以了。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;
#define maxn 11000
int a[maxn],n,cnt,p,len,x,b[maxn],f[maxn],maxl,m;
inline int getpos(int k,int l,int r)
{
if(l==r)
return l;
int mid=(l+r)>>1;
if(b[mid]<=k)
return getpos(k,l,mid);
else
return getpos(k,mid+1,r);
}
inline void print(int len,int sta)
{
for (int i=sta+1;i<=n;i++)
if (f[i]>=len&&a[i]>a[sta])
{
if (len==1)
{
printf("%d\n",a[i]);
return;
}
else printf("%d ",a[i]);
print(len-1,i);
break;
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&a[i]);
b[1]=a[n];
cnt=1;
f[n]=1;
for(int i=n-1;i>=1;i--)
{
int pos=getpos(a[i],1,cnt+1);
b[pos]=a[i];
if(pos>cnt)
cnt=pos;
if(cnt>maxl)
maxl=cnt;
f[i]=pos;
}
scanf("%d",&m);
for (int i=1;i<=m;i++)
{
scanf("%d",&x);
if (x>maxl)
printf("Impossible\n");
else
print(x,0);
}
return 0;
}