Submission #224182

#TimeUsernameProblemLanguageResultExecution timeMemory
224182BruteforcemanSwap (BOI16_swap)C++11
68 / 100
904 ms110840 KiB
#include <bits/stdc++.h> using namespace std; using pii = pair <int, int>; const int maxn = 1e5 + 5; map <int, int> dp[maxn], op[maxn]; int a[maxn]; int n; void dfs(int x) { int l = x << 1; int r = l + 1; if(l <= n) dfs(l); if(r <= n) dfs(r); vector <int> imp; int cur = x; imp.emplace_back(a[x]); while(cur > 1) { int nxt = cur / 2; imp.emplace_back(a[nxt]); if(cur & 1) imp.emplace_back(a[cur ^ 1]); cur = nxt; } if(r <= n) { for(int y : imp) { vector <pii> opt ({{INT_MAX, INT_MAX}, {INT_MAX, INT_MAX}, {INT_MAX, INT_MAX}}); for(int i = 0; i <= 1; i++) { for(int j = 0; j <= 1; j++) { int p = y, q = a[l], s = a[r]; if(i) swap(p, q); if(j) swap(p, s); vector <pii> can; can.emplace_back(x, p); can.emplace_back(dp[l][q], q); can.emplace_back(dp[r][s], s); sort(can.begin(), can.end()); if(opt > can) { opt = can; for(auto w : can) if(w.second == y) dp[x][y] = w.first; op[x][y] = j * 2 + i; } } } } } else if (l <= n) { for(int y : imp) { vector <pii> opt ({{INT_MAX, INT_MAX}, {INT_MAX, INT_MAX}}); for(int i = 0; i <= 1; i++) { int p = y, q = a[l]; if(i) swap(p, q); vector <pii> can; can.emplace_back(x, p); can.emplace_back(dp[l][q], q); sort(can.begin(), can.end()); if(opt > can) { opt = can; for(auto w : can) if(w.second == y) dp[x][y] = w.first; op[x][y] = i; } } } } else { for(int y : imp) { dp[x][y] = x; op[x][y] = 0; } } } void getOpt(int x) { int i = op[x][a[x]] & 1; int j = op[x][a[x]] >> 1; int l = x << 1; int r = l + 1; if(i) swap(a[x], a[l]); if(j) swap(a[x], a[r]); if(l <= n) getOpt(l); if(r <= n) getOpt(r); } int main() { ios_base :: sync_with_stdio (false); cin.tie(0); cin >> n; for(int i = 1; i <= n; i++) { cin >> a[i]; } dfs(1); getOpt(1); for(int i = 1; i <= n; i++) { cout << a[i] << ' '; } cout << endl; 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...