#include <iostream>
#include <algorithm>
#include <string.h>
#include <vector>
using namespace std;
using ll = long long;
const ll mod = 1000000007;
int n;
struct Da{
ll x, y;
bool operator <(const Da &a) const{
if(x == a.x) return y < a.y;
else return x < a.x;
}
bool operator !=(const Da &a) const{
return x != a.x || y != a.y;
}
} arr[100099], nrr[100099];
Da f(Da k, ll v){
if(k.x + k.y <= v) return k;
for(int i = 0; i <= 31; i ++){
ll yi = 1;
yi <<= i;
if(k.x & yi){
if(k.x - yi + k.y <= v) return {v - k.y, k.y};
else k.x -= yi;
}
if(k.y & yi){
if(k.y - yi + k.x <= v) return {k.x, v - k.x};
else k.y -= yi;
}
}
}
ll dst(Da kk, Da ko){
ll s = 0, e = max(kk.x + kk.y, ko.x + ko.y);
while(s <= e){
int m = (s + e) / 2;
if(f(kk, m) != f(ko, m)) e = m - 1;
else s = m + 1;
}
return kk.x + kk.y + ko.x + ko.y - e * 2;
}
int main()
{
scanf("%d", &n);
ll ma = 0;
for(int i = 1; i <= n; i ++){
scanf("%lld %lld", &arr[i].x, &arr[i].y);
ma = max(ma, arr[i].x + arr[i].y);
}
ll s = 0, e = ma;
while(s <= e){
ll m = (s + e) / 2;
for(int i = 1; i <= n; i ++) nrr[i] = f(arr[i], m);
sort(nrr + 1, nrr + n + 1);
int yu = 0, mm = 0;
for(int i = 1; i <= n; i ++){
if(nrr[i - 1] != nrr[i]) yu = 0;
yu ++;
mm = max(mm, yu);
}
if(mm * 2 >= n) s = m + 1;
else e = m - 1;
}
for(int i = 1; i <= n; i ++){
nrr[i] = f(arr[i], e);
}
sort(nrr + 1, nrr + n + 1);
Da mo;
int yu = 0;
for(int i = 1; i <= n; i ++){
if(nrr[i - 1].x != nrr[i].x) yu = 0;
yu ++;
if(yu * 2 >= n){
mo = nrr[i];
break;
}
}
ll ret = 0;
for(int i = 1; i <= n; i ++) ret += dst(mo, arr[i]);
printf("%lld", ret);
return 0;
}
Compilation message (stderr)
cvenk.cpp: In function 'Da f(Da, ll)':
cvenk.cpp:40:1: warning: control reaches end of non-void function [-Wreturn-type]
40 | }
| ^
cvenk.cpp: In function 'int main()':
cvenk.cpp:54:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
54 | scanf("%d", &n);
| ~~~~~^~~~~~~~~~
cvenk.cpp:57:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
57 | scanf("%lld %lld", &arr[i].x, &arr[i].y);
| ~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |