Submission #1137050

#TimeUsernameProblemLanguageResultExecution timeMemory
1137050eggx50000ČVENK (COI15_cvenk)C++20
60 / 100
700 ms3548 KiB
#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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...