Submission #1085231

#TimeUsernameProblemLanguageResultExecution timeMemory
1085231eysbutnoUntitled (POI11_rot)C++17
100 / 100
436 ms36868 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; int main() { int n; cin >> n; int timer = 0; vector<ll> inversions(2 * n - 1); map<int, Tree<int>> sets; function<void(int)> dfs = [&](int idx) { assert(idx < (int) inversions.size()); int val; cin >> val; if (val == 0) { int idx_l = ++timer; dfs(idx_l); int idx_r = ++timer; dfs(idx_r); if (sets[idx_l].size() > sets[idx_r].size()) { sets[idx_l].swap(sets[idx_r]); } ll opt_1 = 0, opt_2 = 0; for (int v : sets[idx_l]) { int loc = sets[idx_r].order_of_key(v); opt_1 += loc; opt_2 += (int) sets[idx_r].size() - loc; } for (int v : sets[idx_l]) { sets[idx_r].insert(v); } inversions[idx] = inversions[idx_l] + inversions[idx_r] + min(opt_1, opt_2); sets[idx].swap(sets[idx_r]); sets.erase(idx_l); sets.erase(idx_r); } else { sets[idx].insert(val); } }; dfs(0); cout << inversions[0] << "\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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...