G - Minimum Permutation Editorial by inszva

O(N) Using stack

Use a stack to save the answer. Continuing push elements into the stack after popping the back of the stack if it is less that the element and can be pushed later. Skip ones we already pushed into the stack.

int main() {
    int n, m;
    cin >> n >> m;
    vector<int> a(n);
    vector<int> cnt(m+1);
    for (int& x: a) {
        cin >> x;
        cnt[x]++;
    }
    vector<int> vis(m+1);
    vector<int> st;
    for (int x: a) {
        if (!vis[x]) {
            while (!st.empty() && st.back() > x && cnt[st.back()]) {
                vis[st.back()] = 0;
                st.pop_back();
            }
            st.emplace_back(x);
            vis[x] = 1;
        }
        cnt[x]--;
    }
    for (int x: st) cout<< x<<" ";
    cout << endl;
    return 0;
}

posted:
last update: