제출 #1343140

#제출 시각아이디문제언어결과실행 시간메모리
1343140gkos5678ČVENK (COI15_cvenk)C++20
60 / 100
482 ms1996 KiB
#include <bits/stdc++.h>
using namespace std;

#define ff first
#define ss second

typedef long long ll;
typedef pair<ll, ll> ii;

const int maxn = 1e5 + 7;

ll n;
ii t[maxn];

ii lift(ll x, ll y, ll k){
    if (k <= 0) return {x, y};
    if (x == 0) return {0, y - k};
    if (y == 0) return {x - k, 0};
    if ((x & -x) < (y & -y))
        return lift(x - min(k, x & -x), y, k - (x & -x));
    else
        return lift(x, y - min(k, y & -y), k - (y & -y));
}

ii lca(ii a, ii b){
    if ((a.ff + a.ss) > (b.ff + b.ss))
        swap(a, b);
    b = lift(b.ff, b.ss, b.ff + b.ss - a.ff - a.ss);
    ll db = a.ss + a.ff;
    ll l = 0, r = db;
    while(l < r){
        ll m = (l + r) / 2;
        ii la = lift(a.ff, a.ss, m);
        ii lb = lift(b.ff, b.ss, m);
        if (la == lb) r = m;
        else l = m + 1;
    }
    return lift(a.ff, a.ss, l);
}

ll subtree(ll x, ll y){
    ll ret = 0;
    for (int i = 1; i <= n; i++){
        ii lf = lift(t[i].ff, t[i].ss, t[i].ff + t[i].ss - x - y);
        if (lf == make_pair(x, y)) ret++;
    }
    return ret;
}

bool check(ii a){
    ll ch1 = subtree(a.ff + 1, a.ss), ch2 = subtree(a.ff, a.ss + 1);
    if (ch1 * 2 > n || ch2 * 2 > n)
        return 0;
    return 1;
}

int main(){
    srand(time(0));
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);

    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> t[i].ff >> t[i].ss;

    ii ansp = {-1, -1};
    while(true){
        int i1 = (rand() * rand()) % n + 1;
        ll l = 0, r = t[i1].ff + t[i1].ss;
        while(l < r){
            ll m = (l + r) / 2;
            ii lf = lift(t[i1].ff, t[i1].ss, m);
            ll st = subtree(lf.ff, lf.ss);
            if (2 * st >= n) r = m;
            else l = m + 1;
        }
        ii lf = lift(t[i1].ff, t[i1].ss, l);
        if (check(lf)){
            ansp = lf;
            break;
        }
    }

    ll ans = (ansp.ff + ansp.ss) * n;
    for (int i = 1; i <= n; i++){
        ii lc = lca(t[i], ansp);
        ans += t[i].ff + t[i].ss - 2LL * (lc.ff + lc.ss);
    }
    cout << ans << "\n";
    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...