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...