Submission #322275

#TimeUsernameProblemLanguageResultExecution timeMemory
322275dolphingarlicSwap (BOI16_swap)C++14
100 / 100
172 ms14828 KiB
#include <bits/stdc++.h>
#define FOR(i, x, y) for (int i = x; i < y; i++)
using namespace std;
typedef pair<int, int> pi;
 
map<pi,int> bes;
int n, p[200001];
 
int get(int ind, int y) {
    if (bes.count({ind,y})) return bes[{ind,y}];
    if (2*ind > n) return ind;
    if (2*ind+1 > n) {
        if (y > p[2*ind]) return 2*ind;
        return ind;
    }
    if (y < min(p[2*ind],p[2*ind+1])) return bes[{ind,y}] = ind;
    if (p[2*ind] < min(y,p[2*ind+1])) return bes[{ind,y}] = get(2*ind,y);
    int mn = min(y,p[2*ind]);
    if (get(2*ind,mn) < get(2*ind+1,mn)) {
        if (mn == y) return bes[{ind,y}] = get(2*ind,y);
        return bes[{ind,y}] = get(2*ind+1,y);
    } else {
        if (mn == y) return bes[{ind,y}] = get(2*ind+1,y);
        return bes[{ind,y}] = get(2*ind,y);
    }
}
 
void solve(int ind) {
    if (2*ind > n) return;
    if (2*ind+1 > n) {
        if (p[ind] > p[2*ind]) swap(p[ind],p[2*ind]);
        return;
    }
    
    if (p[ind] < min(p[2*ind],p[2*ind+1])) {
        
    } else if (p[2*ind] < min(p[ind],p[2*ind+1])) {
        swap(p[2*ind],p[ind]);
    } else {
        int mn = min(p[ind],p[2*ind]), mx = max(p[ind],p[2*ind]);
        
        p[ind] = p[2*ind+1];
        if (get(2*ind,mn) < get(2*ind+1,mn)) {
            p[2*ind] = mn, p[2*ind+1] = mx;
        } else {
            p[2*ind] = mx, p[2*ind+1] = mn;    
        }
    }
    solve(ind+1);
}
 
int main() {
    ios_base::sync_with_stdio(0); cin.tie(0);
    cin >> n;
    FOR(i,1,n+1) cin >> p[i];
    solve(1);
    FOR(i,1,n+1) cout << p[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...