Submission #1296743

#TimeUsernameProblemLanguageResultExecution timeMemory
1296743SamueleVidThe Big Prize (IOI17_prize)C++20
95.83 / 100
15 ms400 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;


vector<int> ask(int i);

int quanti_non_brutti;

int sol = -1;

void rec(int l, int r, int dentro, int quanti_sx, int quanti_dx) {
    if (sol != -1) return;
    if (r - l == 0) return;
    if (dentro == 0) return;
    int m = (l + r) / 2;

    for (int k = m; k < r; k ++) {
        auto v = ask(k);
        int s = v[0], d = v[1];
        if (s + d == 0) {
            sol = k;
            return;
        }
        if (s + d != quanti_non_brutti) {
            continue;
        }
        s -= quanti_sx;
        d -= quanti_dx;

        rec(l, m, s, quanti_sx, quanti_dx + d);
        rec(k + 1, r, d, s + quanti_sx, quanti_dx);
        return;
    }
    
    rec(l, m, dentro, quanti_sx, quanti_dx);    
}

int find_best(int N) {
    int quanti = 0;
    int ziopera;
    int quanti_uguali = 0;
    for (int i = 0; i < 475; i ++) {
        auto v = ask(i);
        int s = v[0], d = v[1];
        if (s + d == quanti) quanti_uguali ++;
        if (s + d > quanti) {
            quanti = s + d;
            ziopera = i;
            quanti_uguali = 1;
        }
        if (s + d == 0) return i;
    }
    quanti_non_brutti = quanti;

    // cout << "quanti_non_brutti : " << quanti_non_brutti << '\n';
    // cout << "primo lombrico : " << ziopera << '\n';

    rec(475, N, quanti, 474 - quanti_uguali, 0);

    return sol;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...