Submission #197737

#TimeUsernameProblemLanguageResultExecution timeMemory
197737dolphingarlicČVENK (COI15_cvenk)C++14
0 / 100
255 ms96032 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll tot_dist = 0, ans = LLONG_MAX; struct Node { ll x, y, l; Node *c[2]; Node(ll X = 0, ll Y = 0): x(X), y(Y), l(0) { c[0] = c[1] = NULL; } void insert(Node *ins, int child) { l++; if (!c[child]) { c[child] = ins; return; } ins->c[child] = c[child]; ins->l += c[child]->l; c[child] = ins; } }; int n; Node *root = new Node(); void dfs(Node *curr) { ans = min(ans, tot_dist); for (int i = 0; i < 2; i++) { if (curr->c[i]) { ll dx = curr->x - curr->c[i]->x + curr->y - curr->c[i]->y; tot_dist += dx * (2 * curr->c[i]->l - n); dfs(curr->c[i]); tot_dist -= dx * (2 * curr->c[i]->l - n); } } } pair<ll, ll> a[100000]; bool cmp(pair<ll, ll> x, pair<ll, ll> y) { return x.first + x.second > y.first + y.second; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); cin >> n; for (int i = 0; i < n; i++) { cin >> a[i].first >> a[i].second; tot_dist += a[i].first + a[i].second; } sort(a, a + n, cmp); for (int i = 0; i < n; i++) { Node *curr = root; ll cx = 0, cy = 0; for (int j = 30; ~j; j--) { if (a[i].first & (1 << j)) { cx |= (1 << j); curr->insert(new Node(cx, cy), 0); curr = curr->c[0]; } else if (a[i].second & (1 << j)) { cy |= (1 << j); curr->insert(new Node(cx, cy), 1); curr = curr->c[1]; } } curr->l++; } dfs(root); cout << ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...