Submission #539011

#TimeUsernameProblemLanguageResultExecution timeMemory
539011qwerasdfzxclSwap (BOI16_swap)C++14
68 / 100
1016 ms176912 KiB
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
vector<int> dp[200200][18][2];
int a[400400], n;

vector<int> combine(int x, int s1, int i1, int j1, int s2, int i2, int j2){
    if (s1>n) return {x};
    vector<int> ret = {x};
    if (s2>n){
        for (auto &y:dp[s1][i1][j1]) ret.push_back(y);
        return ret;
    }

    int pt = 0;
    for (int t=1;;t*=2){
        for (int i=0;i<t;i++){
            if (pt+i>=(int)dp[s1][i1][j1].size()) break;
            ret.push_back(dp[s1][i1][j1][pt+i]);
        }
        for (int i=0;i<t;i++){
            if (pt+i>=(int)dp[s2][i2][j2].size()) break;
            ret.push_back(dp[s2][i2][j2][pt+i]);
        }

        pt += t;
        if (pt>=(int)dp[s1][i1][j1].size() && pt>=(int)dp[s2][i2][j2].size()) break;
    }
    return ret;
}

void _delete(int s){
    if (s>n) return;
    for (int i=0;i<20;i++){
        dp[s][i][0].clear();
        dp[s][i][1].clear();
        dp[s][i][0].shrink_to_fit();
        dp[s][i][1].shrink_to_fit();
    }
}

void dfs(int s, int dep, vector<pair<int, int>> C){
    C.emplace_back(dep+1, 0);
    if (s*2<=n){
        dfs(s*2, dep+1, C);
    }
    if (s*2+1<=n){
        C.pop_back();
        C.emplace_back(dep, 1);
        C.emplace_back(dep+1, 0);
        dfs(s*2+1, dep+1, C);
        C.pop_back();
    }
    C.pop_back();

    reverse(C.begin(), C.end());
    int cur = s, cdep = dep;

    for (auto &[i, j]:C){
        while(cdep>i){
            cdep--; cur /= 2;
        }
        assert(cdep==i);
        if (j==1) cur *= 2;

        int mn = min({a[cur], a[s*2], a[s*2+1]});
        if (mn==a[cur]) dp[s][i][j] = combine(a[cur], s*2, dep+1, 0, s*2+1, dep+1, 0);
        else if (mn==a[s*2]) dp[s][i][j] = combine(a[s*2], s*2, i, j, s*2+1, dep+1, 0);
        else{
            if (dp[s*2][dep+1][0][0] < dp[s*2][i][j][0]) dp[s][i][j] = combine(a[s*2+1], s*2, dep+1, 0, s*2+1, i, j);
            else if (dp[s*2][dep+1][0][0] > dp[s*2][i][j][0]) dp[s][i][j] = combine(a[s*2+1], s*2, i, j, s*2+1, dep, 1);
            else dp[s][i][j] = min(combine(a[s*2+1], s*2, dep+1, 0, s*2+1, i, j), combine(a[s*2+1], s*2, i, j, s*2+1, dep, 1));
        }

        if (j==1) cur /= 2;
    }

    _delete(s*2);
    _delete(s*2+1);
}

int main(){
    scanf("%d", &n);
    for (int i=1;i<=n;i++) scanf("%d", a+i);
    for (int i=n+1;i<=n*2+1;i++) a[i] = 1e9;

    dfs(1, 1, {{1, 0}});
    for (auto &x:dp[1][1][0]) printf("%d ", x);
    return 0;
}

Compilation message (stderr)

swap.cpp: In function 'void dfs(int, int, std::vector<std::pair<int, int> >)':
swap.cpp:60:16: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   60 |     for (auto &[i, j]:C){
      |                ^
swap.cpp: In function 'int main()':
swap.cpp:84:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   84 |     scanf("%d", &n);
      |     ~~~~~^~~~~~~~~~
swap.cpp:85:33: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   85 |     for (int i=1;i<=n;i++) scanf("%d", a+i);
      |                            ~~~~~^~~~~~~~~~~
#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...