Submission #1350833

#TimeUsernameProblemLanguageResultExecution timeMemory
1350833piolkStone Arranging 2 (JOI23_ho_t1)C++20
100 / 100
112 ms20420 KiB
#include <bits/stdc++.h>
using namespace std;

struct cmp{
    bool operator()(pair<int,int> a,pair<int,int> b) const {
        if (a.first!=b.first) return a.first<b.first;
        return a.second>b.second;
    }
};

int main(){
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    int n;
    cin>>n;

    vector<int> a(n);
    for (int i=0;i<n;i++) cin>>a[i];

    set<pair<int,int>,cmp> st;
    vector<vector<pair<int,int>>> vec(n+1);
    vector<int> info(n+1);
    stack<pair<int,int>> ins;
    int nr=1;
    for (int i=0;i<n;i++){
        int x=a[i];
        auto it=st.lower_bound({x,n+1});

        if (it!=st.end() && (*it).first==x){
            int ind=(*it).second;
            vec[ind].push_back({nr,1});
            vec[i+1].push_back({nr,0});
            info[nr]=x;
            nr++;

            while (!ins.empty() && ins.top().second>=ind){
                st.erase({ins.top().first,ins.top().second});
                ins.pop();
            }
        }

        st.insert({x,i});
        ins.push({x,i});
    }

    vector<int> ans(n);

    priority_queue<int> pq;
    vector<bool> bad(n+1);
    for (int i=0;i<n;i++){
        for (auto [f,s]:vec[i]){
            if (s==0) bad[f]=true;
            else pq.push(f);
        }
        while (!pq.empty() && bad[pq.top()]) pq.pop();
        if (!pq.empty()) ans[i]=info[pq.top()];
        else ans[i]=a[i];
    }

    for (int x:ans) cout<<x<<"\n";

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...