C - LIS to Original Sequence(LIS+构造)
思路:
题目给出 L I S LIS LIS,我们可以得出在 A i A_i Ai到 A i + 1 A_{i+1} Ai+1之间肯定是递减的序列,且不属区间 [ A i , A i + 1 ] [A_i,A_{i+1}] [Ai,Ai+1],这样保证了 L I S LIS LIS不会增大。然后题目要构造字典序最小,我们就将能放在 A i , A i + 1 A_i,A_{i+1} Ai,Ai+1之间的数放一个最小的放在总结,其余的以降序放在 A n A_n An之后
代码:
#include <iostream>
using namespace std;
const int N=2e5+7;
int k,n,a[N],B[N];
int main(){
cin>>n>>k;
for(int i=1;i<=k;i++) cin>>a[i];
int j=1;
for(int i=1;i<k;i++){
printf("%d ",a[i]);
B[a[i]]=1;
while(B[j]) j++;
if(j<a[i]){
printf("%d ",j);
B[j]=1;
while(B[j]) j++;
}
}
for(int i=n;i>=1;i--) if(!B[i]) printf("%d ",i);
puts("");
}