思路:
题目看错了,是位置的字典序最小。。水题,倒着想应该还是满显然的。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
const int imax=10000+229;
int n,Q;
int f[imax];
int a[imax],ans[imax],len;
int ibound(int x)
{
int l=1; int r=len; int pos=0;
while(l<=r)
{
int Mid=(l+r)>>1;
if(ans[Mid]>x) { pos=Mid; l=Mid+1;}
else r=Mid-1;
}
return pos;
}
void iprintf(int x)
{
int last=0;
for(int i=1;i<=n;i++)
{
if(f[i]>=x && a[i]>last)
{
printf("%d",a[i]);
if(x!=1) printf(" ");
last=a[i]; x--;
}
if(!x) break;
}
puts("");
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=n;i>=1;i--)
{
int pos=ibound(a[i]);
f[i]=pos+1;
len=max(len,pos+1);
if(ans[pos+1]<a[i]) ans[pos+1]=a[i];
}
scanf("%d",&Q);
while(Q--)
{
int nowlen;
scanf("%d",&nowlen);
if(nowlen>len) { puts("Impossible"); continue;}
else iprintf(nowlen);
}
return 0;
}