Advertisement
Guest User

Untitled

a guest
Mar 23rd, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.34 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. #define FOR(i, a, b) for(int i = a; i < b; ++i)
  5. #define REP(i, n) FOR(i, 0, n)
  6. #define _ << " " <<
  7.  
  8. typedef long long ll;
  9. typedef pair<int, int> point;
  10.  
  11. const int P = 1 << 30, MAXN = 1e5 + 5;
  12.  
  13. void path(int x, int y, vector<int> &ret) {
  14.   int pot = P;
  15.   while(pot) {
  16.     if(x >= pot) ret.push_back(1);
  17.     else if(y >= pot) ret.push_back(2);
  18.     else ret.push_back(0);
  19.  
  20.     x %= pot;
  21.     y %= pot;
  22.  
  23.     pot /= 2;
  24.   }
  25. }
  26.  
  27. ll len(vector<int> &v) {
  28.   ll ret = 0;
  29.   for(int i = 0, pot = P; pot; pot /= 2, ++i) {
  30.     ret += pot * ((v[i] + 1) / 2);
  31.   }
  32.  
  33.   return ret;
  34. }
  35.  
  36. ll dist(point A, point B) {
  37.   ll ret = 0;
  38.  
  39.   vector<int> v1;
  40.   v1.reserve(32);
  41.   path(A.first, A.second, v1);
  42.  
  43.   vector<int> v2;
  44.   v2.reserve(32);
  45.   path(B.first, B.second, v2);
  46.  
  47.   int diff = 0, need = 0;
  48.  
  49.   for(int i = 0, pot = P; pot; pot /= 2, ++i) {
  50.     if(!diff && v1[i] != v2[i]) {
  51.       if(min(v1[i], v2[i]) != 0) {
  52.         return len(v1) + len(v2);
  53.       }
  54.       diff = max(v1[i], v2[i]);
  55.       if(diff == v2[i]) {
  56.         swap(v1, v2);
  57.         swap(A, B);
  58.       }
  59.       v1[i] = 0;
  60.       need = pot;
  61.       ret += len(v1);
  62.     }
  63.  
  64.     if(diff && diff == v2[i]) {
  65.       need -= pot;
  66.     }
  67.  
  68.     if((diff ^ v2[i]) == 3) {
  69.       ret += len(v2);
  70.       ret += need;
  71.       need = 0;
  72.       break;
  73.     }
  74.  
  75.     v1[i] = v2[i] = 0;
  76.   }
  77.  
  78.   return ret + need;
  79. }
  80.  
  81. int a[MAXN], b[MAXN], n;
  82.  
  83. ll calc(int x, int y) {
  84.   ll ret = 0;
  85.   REP(i, n) {
  86.     ret += dist({x, y}, {a[i], b[i]});
  87.   }
  88.  
  89.   return ret;
  90. }
  91.  
  92. map<string, int> kurci;
  93.  
  94. int main() {
  95. /*
  96.   while(1) {
  97.     int xx, yy, aa, bb; cin >> xx >> yy >> aa >> bb;
  98.     cout << dist({xx, yy}, {aa, bb}) << endl;
  99.   }*/
  100.  
  101.   ios_base::sync_with_stdio(false); cin.tie(0);
  102.  
  103.   cin >> n;
  104.  
  105.   REP(i, n) {
  106.     cin >> a[i] >> b[i];
  107.     vector<int> v;
  108.     v.reserve(32);
  109.     path(a[i], b[i], v);
  110.  
  111.     string s = "";
  112.     for(auto x: v) {
  113.       s += char('0' + x);
  114.       kurci[s] ++;
  115.     }
  116.  
  117.   }
  118.  
  119.   int x = 0, y = 0; string putanja = "";
  120.  
  121.   for(int pot = P; pot; pot /= 2) {
  122.     if(kurci[putanja + '1'] >= ((n + 1) / 2)) {
  123.       x += pot;
  124.       putanja += '1';
  125.     }
  126.     else if(kurci[putanja + '2'] >= ((n + 1) / 2)) {
  127.       y += pot;
  128.       putanja += '2';
  129.     }
  130.     else {
  131.       putanja += '0';
  132.     }
  133.   }
  134.  
  135.   cout << calc(x, y);
  136. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement