Submission #541179

#TimeUsernameProblemLanguageResultExecution timeMemory
541179alextodoranThe Big Prize (IOI17_prize)C++17
20 / 100
92 ms3648 KiB
/**
 ____ ____ ____ ____ ____
||a |||t |||o |||d |||o ||
||__|||__|||__|||__|||__||
|/__\|/__\|/__\|/__\|/__\|

**/

#include <bits/stdc++.h>
#include "prize.h"

#pragma GCC optimize ("unroll-loops")

using namespace std;

typedef long long ll;

vector <int> ask (int i);

vector <int> L, R;

void discover (int i) {
    vector <int> resp = ask(i);
    L[i] = resp[0];
    R[i] = resp[1];
}
int getL (int i) {
    if (L[i] == -1) {
        discover(i);
    }
    return L[i];
}
int getR (int i) {
    if (R[i] == -1) {
        discover(i);
    }
    return R[i];
}
int getLR (int i) {
    return getL(i) + getR(i);
}

vector <int> findLess (const vector <int> &v) {
    assert((int) v.size() > 0);
    int cntLess = 0;
    int k = 7;
    while (k--) {
        int i = v[rand() % (int) v.size()];
        cntLess = max(cntLess, getLR(i));
    }
    vector <int> vless;
    while ((int) vless.size() < cntLess) {
        int lo = (vless.empty() == true ? 0 : vless.back() + 1);
        int hi = (int) v.size();
        while (lo < hi) {
            int mid = (lo + hi) / 2;
            if (getLR(v[mid]) != cntLess) {
                hi = mid;
            } else if (getL(v[mid]) > (int) vless.size()) {
                hi = mid;
            } else {
                lo = mid + 1;
            }
        }
        assert(lo < (int) v.size());
        vless.push_back(lo);
    }
    for (int &x : vless) {
        x = v[x];
    }
    return vless;
}

int find_best (int n) {
    L = vector <int> (n, -1);
    R = vector <int> (n, -1);
    vector <int> v (n);
    iota(v.begin(), v.end(), 0);
    while ((int) v.size() > 1) {
        v = findLess(v);
    }
    return v.front();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...