Submission #547623

#TimeUsernameProblemLanguageResultExecution timeMemory
547623JomnoiUntitled (POI11_rot)C++17
36 / 100
1100 ms65536 KiB
#include <bits/stdc++.h> #include <ext/pb_ds/assoc_container.hpp> #define DEBUG 0 using namespace std; using namespace __gnu_pbds; template <typename T> using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>; const int MAX_N = 4e5 + 10; int n, cnt; int L[MAX_N], R[MAX_N]; ordered_set <int> arr[MAX_N]; int read_input() { int now; cin >> now; if(now == 0) { now = ++cnt; L[now] = read_input(); R[now] = read_input(); } else { now += n; L[now] = R[now] = -1; } return now; } long long dfs(const int &u) { if(L[u] == -1 and R[u] == -1) { arr[u].insert(u - n); return 0; } int v1 = L[u], v2 = R[u]; long long res = dfs(v1) + dfs(v2); long long inv = 0, all = arr[v1].size() * arr[v2].size(); if(arr[v1].size() < arr[v2].size()) { swap(v1, v2); } for(auto x : arr[v2]) { inv += arr[v1].size() - arr[v1].order_of_key(x + 1); } inv = min(inv, all - inv); swap(arr[u], arr[v1]); for(auto x : arr[v2]) { arr[u].insert(x); } return res + inv; } int main() { cin.tie(0)->sync_with_stdio(0); cin >> n; read_input(); cout << dfs(1); 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...
#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...