题解:CF911E Stack Sorting

· · 题解

duel 被萝卜喵打爆了 /ll

手速太慢导致的,我怎么这么菜 /ll /ll /ll

给出了一部分,可以模拟栈排序。

如果到了自己填的时候栈非空,我们对于每一个栈顶递减的向下输出直到能够模拟升序排序。

这些输出显然是必需的,降序只是为了保证字典序要求。

如果说我们需要的数字在栈里,那么一定无解。

做完了。

#include<bits/stdc++.h>
using namespace std;
int a[200005];
stack<int>st;
int need=1;
map<int,bool>mp;
vector<int>ret;
int main(){
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=k;i++){
        cin>>a[i];
        mp[a[i]]=1;
        st.push(a[i]);
        while(!st.empty()&&st.top()==need)
            st.pop(),need++;
    }
    if(st.empty()){
        for(int i=1;i<=k;i++)
            cout<<a[i]<<' ';
        for(int i=n;i>=need;i--)
            cout<<i<<' ';
        return 0;
    }
    for(int i=1;i<=k;i++)
        ret.push_back(a[i]);
    while(!st.empty()){
        for(int i=need;i<st.top();i++)
            if(mp[i]){
                puts("-1");
                return 0;
            }
        for(int i=st.top()-1;i>=need;i--)
            ret.push_back(i);
        need=st.top()+1;
        st.pop();
    }
    for(int i=n;i>=need;i--)
        ret.push_back(i);
    for(int i=0;i<n;i++)cout<<ret[i]<<' ';
    return 0;
}

Accepted.