Submission #1253119

#TimeUsernameProblemLanguageResultExecution timeMemory
1253119nrg_studioSwap (BOI16_swap)C++20
100 / 100
812 ms13128 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define pb push_back
#define pii pair<int,int>
#define f first
#define s second
#define chmin(a, b) a = min(a,b)
#define chmax(a, b) a = max(a,b)
#define FOR(i, a, b) for (int i = (a); i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define all(x) x.begin(),x.end()
#define vec vector

const int N = 2e5, l2 = 36;
bool dp[N][l2][2] = {false};
int a[N], sz[N];
int n;

vec<int> st;
vec<int> p1, p2;
queue<array<int,3>> q;

void get(vec<int>& p) {
    p.clear();
    while (q.size()) {
        array<int,3> cur = q.front(); q.pop();
        int l = 2*cur[0]+1, r = 2*cur[0]+2, i = cur[1];
        if (l<n) {
            if (dp[cur[0]][i][0]) {
                q.push({{l,cur[1],cur[2]}});
                cur[1] = sz[l]-1; cur[2] = a[l];
            } else {
                q.push({{l,sz[l]-1,a[l]}});
            }

            if (r<n) {
                if (dp[cur[0]][i][1]) {
                    q.push({{r,cur[1],cur[2]}});
                    cur[2] = a[r];
                } else {
                    q.push({{r,sz[r]-1,a[r]}});
                }
            }
        }
        p.pb(cur[2]);
    }
}

bool cmp() {
    for (int i=0;i<p1.size();i++) {
        if (p1[i]>p2[i]) {return false;}
        if (p1[i]<p2[i]) {return true;}
    } return true;
}

void dfs(int cur=0) {
    sz[cur] = st.size();
    if (2*cur+1<n) {
        st.pb(a[2*cur+1]);
        dfs(2*cur+1);

        if (2*cur+2<n) {
            st.pb(a[2*cur+2]);
            dfs(2*cur+2);
            st.pop_back();
        }
        st.pop_back();

        int l = a[2*cur+1], r = (2*cur+2>=n ? 3e5 : a[2*cur+2]);
        for (int i=0;i<st.size();i++) {
            //cout<<st[i]<<' ';
            int x = st[i];
            //if (x==3 && cur==1) {cout << x << ' ' << l << ' ' << r << '\n';}
            if (l<min(x,r)) {
                dp[cur][i][0] = true;
            } else if (r<min(x,l)) {
                dp[cur][i][0] = dp[cur][i][1] = true;
                q.push({{cur,i,x}});
                get(p1);

                dp[cur][i][0] = false;
                q.push({{cur,i,x}});
                get(p2);
                
                if (cmp()) {dp[cur][i][0] = true;}
            }
        }//cout<<'\n';
    }


}

int main() {
    ios::sync_with_stdio(false); cin.tie(0);
    
    cin >> n;
    for (int i=0;i<n;i++) {cin >> a[i];}

    st.pb(a[0]);
    dfs();
    q.push({{0,0,a[0]}});
    get(p1);
    for (int i=0;i<n;i++) {cout << p1[i] << ' ';}

    //cout << dp[1][0][0]<<' '<<dp[1][0][1]<<'\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...