总是想得很复杂,其实很简单。
用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; }
先声明一下下述的变量
N为总天数,
A[i]表示第i个数字,
f[i]和g[i]的定义见下文
Max=max(f[i])1<=i<=N
第一问就是个最简单的最长下降序列,f[i]表示当前包含第i个数字的最长下降序列,
第二问稍复杂,我的分析:
我的代码(因为答案可能很大,所以用了高精度,并重载了"+"运算