题目大意:求长度为n的数列中长度为Li的上升子序列,要求该子序列字典序最小.
(1≤n≤10000,1≤i≤m,1≤m≤1000).
考虑按下标顺序构造长度为L的子序列,设构造到第i个数,显然当且仅当已选的数的个数+以第i个数开头的最长上升子序列的长度≥L时,第i个数在最优解中.
那么我们要求以第i个数开头的最长上升子序列的长度,不难发现可以转化为求最长下降序列,问题就解决了.
偷懒Θ(n2)过了,233...
AC code:
#include <cstdio>
const int N=10010;
int n,m;
int a[N],b[N],f[N],g[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1,j=n;i<=n;i++,j--) b[i]=a[j];
for(int i=1;i<=n;i++){
g[i]=1;
for(int j=1;j<i;j++){
if(b[j]>b[i]&&g[j]+1>g[i]) g[i]=g[j]+1;
}
}
for(int i=1,j=n;i<=n;i++,j--) f[i]=g[j];
scanf("%d",&m);
for(int i=1;i<=m;i++){
int l,last=0;
scanf("%d",&l);
for(int j=1;j<=n&&l;j++){
if(f[j]>=l&&a[j]>last){
printf("%d%c",a[j],--l?' ':'\n');
last=a[j];
}
}
if(l) printf("Impossible\n");
}
return 0;
}