This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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 time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |