Submission #789093

#TimeUsernameProblemLanguageResultExecution timeMemory
789093t6twotwoThe Big Prize (IOI17_prize)C++17
90 / 100
50 ms424 KiB
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
int find_best(int N) {
    int lol = -1, ted = -1, cnt = 0;
    vector<vector<int>> a(475);
    for (int i = 0; i < 475; i++) {
        a[i] = ask(i);
        int s = a[i][0] + a[i][1];
        if (s == 0) {
            return i;
        }
        lol = max(lol, s);
    }
    for (int i = 0; i < 475; i++) {
        int s = a[i][0] + a[i][1];
        if (s < lol) {
            cnt++;
            ted = max(ted, s);
        }
    }
    int x = 475;
    while (cnt < 27) {
        vector<int> t = ask(x);
        int s = t[0] + t[1];
        if (s == 0) {
            return x;
        }
        if (s == lol) {
            int lo = x, hi = N - 1;
            while (lo < hi) {
                int mi = (lo + hi + 1) / 2;
                vector<int> v = ask(mi);
                if (v == t) {
                    lo = mi;
                } else {
                    hi = mi - 1;
                }
            }
            x = lo;
        } else {
            cnt++;
            ted = max(ted, s);
        }
        x++;
    }
    while (1) {
        vector<int> t = ask(x);
        int s = t[0] + t[1];
        if (s == 0) {
            return x;
        }
        if (s < ted) {
            x++;
            continue;
        }
        if (s == lol) {
            int lo = x, hi = N - 1;
            while (lo < hi) {
                int mi = (lo + hi + 1) / 2;
                vector<int> v = ask(mi);
                if (v == t) {
                    lo = mi;
                } else {
                    hi = mi - 1;
                }
            }
            x = lo + 1;
        } else {
            int lo = x, hi = N - 1;
            while (lo < hi) {
                int mi = (lo + hi + 1) / 2;
                vector<int> v = ask(mi);
                if (v == t) {
                    lo = mi;
                } else if (v[0] + v[1] == lol) {
                    int l = lo + 1, r = mi;
                    while (l < r) {
                        int m = (l + r) / 2;
                        vector<int> u = ask(m);
                        if (u == v) {
                            r = m;
                        } else {
                            l = m + 1;
                        }
                    }
                    if (ask(l - 1) == t) {
                        lo = mi;
                    } else {
                        hi = mi - 1;
                    }
                } else {
                    hi = mi - 1;
                }
            }
            x = lo + 1;
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...