G. Restore the Permutation
对于一个序列 要是我们从数小a[i]的开始
每次给这个a[i]选一个最接近她的一个小的
显然我们这样是 最合法的
但是怎么保证字典序最小呢
显然我们需要从后往前做 这样可以让字典序最小
但是这样合法性会差吗?
我们构造一种最维和的序列
2 4 6
显然这样合法性还是不会差的
所以我们直接从后往前做即可
void solve(){
int n;cin>>n;n>>=1;
vector<int>a(n+1),b(n+1);
set<int>st;
for(int i=1;i<=n<<1;i++){
st.insert(i);
}
int flag=0;
for(int i=1;i<=n;i++){
cin>>a[i];
if(st.count(a[i])==0)flag=1;
st.erase(a[i]);
}
if(flag){
cout<<-1<<endl;
return;
}
for(int i=n;i>=1;i--){
auto it=st.lower_bound(a[i]);
if(it==st.begin()){
cout<<-1<<endl;
return;
}else{
it--;
b[i]=*it;
st.erase(it);
}
}
for(int i=1;i<=n;i++)cout<<b[i]<<' '<<a[i]<<' ';cout<<endl;
}
标签:cout,834,int,Codeforces,st,flag,Div
From: https://www.cnblogs.com/ycllz/p/16906107.html