Submission #1292983

#TimeUsernameProblemLanguageResultExecution timeMemory
1292983jwpassion1Swap (BOI16_swap)C++20
68 / 100
1102 ms208884 KiB
#pragma GCC optimize("O3") #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair<int, int> pii; int n; int a[200001]; map<pii, vector<int>> dp; vector<int> merge(vector<int>& a, vector<int>& b) { vector<int> ret; int ai = 0, bi = 0; for (int i = 1; ; i <<= 1) { if (ai == a.size()) break; int ic = 0; while (ic < i && ai < a.size()) { ret.push_back(a[ai++]); ic++; } ic = 0; while (ic < i && bi < b.size()) { ret.push_back(b[bi++]); ic++; } } return ret; } void dfs(int node, int val) { if (dp.find({node, val}) != dp.end()) return; int l = node << 1, r = node << 1 | 1; if (n < l) dp[{node, val}] = {val}; else if (n < r) dp[{node, val}] = min(vector<int>{val, a[l]}, vector<int>{a[l], val}); else { int fro; vector<int> tmp; if (a[r] <= a[l] && a[r] <= val) { int mi = a[l], ma = val; if (ma < mi) swap(mi, ma); dfs(l, mi); dfs(l, ma); dfs(r, mi); dfs(r, ma); fro = a[r]; tmp = merge(dp[{l, mi}], dp[{r, ma}]); vector<int> tmp1 = merge(dp[{l, ma}], dp[{r, mi}]); tmp = min(tmp, tmp1); } else if (a[l] < val) { dfs(l, val); dfs(r, a[r]); fro = a[l]; tmp = merge(dp[{l, val}], dp[{r, a[r]}]); } else { dfs(l, a[l]); dfs(r, a[r]); fro = val; tmp = merge(dp[{l, a[l]}], dp[{r, a[r]}]); } reverse(tmp.begin(), tmp.end()); tmp.push_back(fro); reverse(tmp.begin(), tmp.end()); dp[{node, val}] = tmp; } //cout << node << ' ' << val << " : \n"; //for (int i : dp[{node, val}]) cout << i << ' '; //cout << '\n'; } int main(){ ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n; for (int i = 1; i <= n; i++) cin >> a[i]; dfs(1, a[1]); vector<int> ans = dp[{1, a[1]}]; for (int i : ans) cout << i << ' '; cout << '\n'; }
#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...