总是想得很复杂,其实很简单。
用O(n2)或者O(nlogn)的时间复杂度统计出fi即以i开始的最长上升序列是多少
因为字典序的缘故,暴力找最优解
假设某次询问是a,给定的数列是{Ai}
对于第一个位置,为了使字典序最小,我们一定选最早的i,使得fi1>=a
对于第二个位置,Ai2一定 且fi1>=a-1所以接着向后找第一个满足着两个条件的位置
……
这一段的代码:
for(int i=1;i<=M;i++){
int j,a,b,pr;
fin>>a;
b=0;
A[pr=0]=-1;
for(j=1;j<=N;j++)
if(f[j]>=a && A[j]>A[pr]){
Ans[++b]=j;
a--;
if(!a)
break;
pr=j;
}
if(b<a){
fout<<"Impossible\n";
continue;
}
for(j=1;j<=b;j++)
fout<<A[Ans[j]]<<" ";
fout<<endl;
}