DP
首先预处理以 i i 为起点的LIS。
一看不会超,那么每次询问复杂度应该就是 O(n) O ( n ) 的了。
扫一遍过去,记下 f[i]≥l−k f [ i ] ≥ l − k 且 a[i]>a[k] a [ i ] > a [ k ] 的 a[i] a [ i ] ,最后输出即可。
注意过滤行末空格。
代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 10005
#define M 1005
using namespace std;
int n,m,sum,f[N],a[N],ans[N];
int main(){
scanf("%d",&n);
for (int i=1;i<=n;i++) scanf("%d",&a[i]),f[i]=1;
for (int i=n;i;i--)
for (int j=n;j>i;j--)
if (a[j]>a[i]) f[i]=max(f[i],f[j]+1);//常数小(其实是我懒)所以就用O(n²)了
scanf("%d",&m); int l,x;
while (m--){
scanf("%d",&l),sum=0;
for (int i=0;i<=n&&l;i=x,l--){
for (x=i+1;x<=n;x++)
if (f[x]>=l&&a[x]>a[i]) break;
if (x>n) break; ans[++sum]=a[x];
}
if (l) puts("Impossible");
else{
for (int i=1;i<sum;i++)
printf("%d ",ans[i]);
printf("%d\n",ans[sum]);
}
}
return 0;
}