Submission #1321039

#TimeUsernameProblemLanguageResultExecution timeMemory
1321039woohyun_jngSwap (BOI16_swap)C++20
68 / 100
1099 ms138920 KiB
#include <bits/stdc++.h>
using namespace std;

typedef array<int, 2> pr;
typedef array<int, 3> tp;

const int MAX = 200001;

int N, A[MAX];
unordered_map<int, tp> dp[MAX];
queue<tp> q;

vector<pr> calc(int node, tp X) {
    vector<pr> res, lv, rv;
    if ((node << 1) <= N)
        lv = calc(node << 1, dp[node << 1][X[1]]);
    if ((node << 1 | 1) <= N)
        rv = calc(node << 1 | 1, dp[node << 1 | 1][X[2]]);
    res.resize(lv.size() + rv.size());
    merge(lv.begin(), lv.end(), rv.begin(), rv.end(), res.begin());
    res.insert(res.begin(), {node, X[0]});
    return res;
}

bool comp(int node, tp X, tp Y) {
    tp K;
    if (X[0] ^ Y[0])
        return X[0] < Y[0];
    else {
        q.push({node << 1, X[1], Y[1]}), q.push({node << 1 | 1, X[2], Y[2]});
        while (!q.empty()) {
            K = q.front(), q.pop();
            if (dp[K[0]][K[1]][0] ^ dp[K[0]][K[2]][0]) {
                while (!q.empty())
                    q.pop();
                return dp[K[0]][K[1]][0] < dp[K[0]][K[2]][0];
            }
            if ((K[0] << 1) <= N) 
                q.push({K[0] << 1, dp[K[0]][K[1]][1], dp[K[0]][K[2]][1]});
            if ((K[0] << 1 | 1) <= N)
                q.push({K[0] << 1 | 1, dp[K[0]][K[1]][2], dp[K[0]][K[2]][2]});
        }
    }
    return false;
}

tp dfs(int node, int val) {
    if (dp[node].find(val) != dp[node].end())
        return dp[node][val];

    int X = node << 1, Y = node << 1 | 1;
    tp res, lv, rv, XV, YV;
    
    res = {0, 0, 0};

    if (X > N)
        res[0] = val;
    else if (Y > N) {
        if (A[X] > val) 
            res[0] = val, res[1] = A[X], dfs(X, A[X]);
        else 
            res[0] = A[X], res[1] = val, dfs(X, val);
    } else {
        if (val < A[X] && val < A[Y]) {
            res[0] = val, res[1] = A[X], res[2] = A[Y];
            dfs(X, A[X]), dfs(Y, A[Y]);
        } else if (A[X] < val && A[X] < A[Y]) {
            res[0] = A[X], res[1] = val, res[2] = A[Y];
            dfs(X, val), dfs(Y, A[Y]);
        } else {
            lv[0] = A[Y], lv[1] = val, lv[2] = A[X], dfs(X, val), dfs(Y, A[X]);
            rv[0] = A[Y], rv[1] = A[X], rv[2] = val, dfs(X, A[X]), dfs(Y, val);
            res = comp(node, lv, rv) ? lv : rv;
        }
    }
    return dp[node][val] = res;
}

signed main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    int X, Y;
    vector<pr> ans;

    cin >> N;
    for (int i = 1 ; i <= N ; i ++)
        cin >> A[i];

    ans = calc(1, dfs(1, A[1]));
    for (int i = 1 ; i <= N ; i ++)
        cout << ans[i - 1][1] << ' ';
    cout << '\n';
    
    return 0;
}
#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...