Codeforces Round #834 (Div. 3) G

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;
}
posted @ 2022-11-19 14:47  ycllz  阅读(35)  评论(0)    收藏  举报