Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- #define FOR(i, a, b) for(int i = a; i < b; ++i)
- #define REP(i, n) FOR(i, 0, n)
- #define _ << " " <<
- typedef long long ll;
- typedef pair<int, int> point;
- const int P = 1 << 30, MAXN = 1e5 + 5;
- void path(int x, int y, vector<int> &ret) {
- int pot = P;
- while(pot) {
- if(x >= pot) ret.push_back(1);
- else if(y >= pot) ret.push_back(2);
- else ret.push_back(0);
- x %= pot;
- y %= pot;
- pot /= 2;
- }
- }
- ll len(vector<int> &v) {
- ll ret = 0;
- for(int i = 0, pot = P; pot; pot /= 2, ++i) {
- ret += pot * ((v[i] + 1) / 2);
- }
- return ret;
- }
- ll dist(point A, point B) {
- ll ret = 0;
- vector<int> v1;
- v1.reserve(32);
- path(A.first, A.second, v1);
- vector<int> v2;
- v2.reserve(32);
- path(B.first, B.second, v2);
- int diff = 0, need = 0;
- for(int i = 0, pot = P; pot; pot /= 2, ++i) {
- if(!diff && v1[i] != v2[i]) {
- if(min(v1[i], v2[i]) != 0) {
- return len(v1) + len(v2);
- }
- diff = max(v1[i], v2[i]);
- if(diff == v2[i]) {
- swap(v1, v2);
- swap(A, B);
- }
- v1[i] = 0;
- need = pot;
- ret += len(v1);
- }
- if(diff && diff == v2[i]) {
- need -= pot;
- }
- if((diff ^ v2[i]) == 3) {
- ret += len(v2);
- ret += need;
- need = 0;
- break;
- }
- v1[i] = v2[i] = 0;
- }
- return ret + need;
- }
- int a[MAXN], b[MAXN], n;
- ll calc(int x, int y) {
- ll ret = 0;
- REP(i, n) {
- ret += dist({x, y}, {a[i], b[i]});
- }
- return ret;
- }
- map<string, int> kurci;
- int main() {
- /*
- while(1) {
- int xx, yy, aa, bb; cin >> xx >> yy >> aa >> bb;
- cout << dist({xx, yy}, {aa, bb}) << endl;
- }*/
- ios_base::sync_with_stdio(false); cin.tie(0);
- cin >> n;
- REP(i, n) {
- cin >> a[i] >> b[i];
- vector<int> v;
- v.reserve(32);
- path(a[i], b[i], v);
- string s = "";
- for(auto x: v) {
- s += char('0' + x);
- kurci[s] ++;
- }
- }
- int x = 0, y = 0; string putanja = "";
- for(int pot = P; pot; pot /= 2) {
- if(kurci[putanja + '1'] >= ((n + 1) / 2)) {
- x += pot;
- putanja += '1';
- }
- else if(kurci[putanja + '2'] >= ((n + 1) / 2)) {
- y += pot;
- putanja += '2';
- }
- else {
- putanja += '0';
- }
- }
- cout << calc(x, y);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement