Submission #1292988

#TimeUsernameProblemLanguageResultExecution timeMemory
1292988jwpassion1Swap (BOI16_swap)C++20
68 / 100
1105 ms202516 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]; vector<vector<int>> dptable; map<pii, int> dp; void cmpmerge(vector<int>& target, vector<int>& a1, vector<int>& b1, vector<int>& a2, vector<int>& b2) { int whi = 0; int ai = 0, bi = 0; for (int i = 1; ; i <<= 1) { if (ai == a1.size()) break; int ic = 0; while (ic < i && ai < a1.size()) { if (whi == 0 && a1[ai] != a2[ai]) { if (a1[ai] < a2[ai]) whi = 1; else whi = 2; } if (whi < 2) target.push_back(a1[ai++]); else target.push_back(a2[ai++]); ic++; } ic = 0; while (ic < i && bi < b1.size()) { if (whi == 0 && b1[bi] != b2[bi]) { if (b1[bi] < b2[bi]) whi = 1; else whi = 2; } if (whi < 2) target.push_back(b1[bi++]); else target.push_back(b2[bi++]); ic++; } } } void merge(vector<int>& target, vector<int>& a, vector<int>& b) { 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()) { target.push_back(a[ai++]); ic++; } ic = 0; while (ic < i && bi < b.size()) { target.push_back(b[bi++]); ic++; } } } void dfs(int node, int val) { if (dp.find({node, val}) != dp.end()) return; dp[{node, val}] = dptable.size(); dptable.push_back(vector<int>()); int l = node << 1, r = node << 1 | 1; if (n < l) dptable[dp[{node, val}]] = {val}; else if (n < r) dptable[dp[{node, val}]] = min(vector<int>{val, a[l]}, vector<int>{a[l], val}); else { 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); dptable[dp[{node, val}]].push_back(a[r]); cmpmerge(dptable[dp[{node, val}]], dptable[dp[{l, mi}]], dptable[dp[{r, ma}]], dptable[dp[{l, ma}]], dptable[dp[{r, mi}]]); } else if (a[l] < val) { dfs(l, val); dfs(r, a[r]); dptable[dp[{node, val}]].push_back(a[l]); merge(dptable[dp[{node, val}]], dptable[dp[{l, val}]], dptable[dp[{r, a[r]}]]); } else { dfs(l, a[l]); dfs(r, a[r]); dptable[dp[{node, val}]].push_back(val); merge(dptable[dp[{node, val}]], dptable[dp[{l, a[l]}]], dptable[dp[{r, a[r]}]]); } } } 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 = dptable[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...