Submission #1322455

#TimeUsernameProblemLanguageResultExecution timeMemory
1322455k1r1t0The Big Prize (IOI17_prize)C++20
100 / 100
21 ms3440 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using vi = vector<int>;

vi ask(int i);

namespace k1r1t0 {

const int N = 210000;
const int G = 476;

map<int, vi> ans;

vi check(int i) {
    if (ans.find(i) == ans.end())
        ans[i] = ask(i);
    return ans[i];
}

int solve(vi &cur, int cl, int cr, int val) {
    if (cl + cr == val)
        return -1;
    int len = cur.size();
    if (len == 1) {
        vi f = check(cur[0]);
        if (f[0] + f[1] == 0)
            return cur[0];
        return -1;
    }
    int l = len / 2, r = len / 2;
    bool f = true;
    int here = val - cl - cr;
    while (true) {
        if (here == 0 || l == -1 || r == len)
            return -1;
        if (f) {
            // check r
            vi f = check(cur[r]);
            if (f[0] + f[1] == val) {
                vi vl, vr;
                for (int i = 0; i < l; i++)
                    vl.push_back(cur[i]);
                for (int i = r + 1; i < len; i++)
                    vr.push_back(cur[i]);
                int v1 = solve(vl, cl, f[1] + r - l, val);
                if (v1 != -1) return v1;
                int v2 = solve(vr, f[0], cr, val);
                return v2;
            } else {
                here--;
                if (f[0] + f[1] == 0)
                    return cur[r];
            }
            l--;
        } else {
            // check l
            vi f = check(cur[l]);
            if (f[0] + f[1] == val) {
                vi vl, vr;
                for (int i = 0; i < l; i++)
                    vl.push_back(cur[i]);
                for (int i = r + 1; i < len; i++)
                    vr.push_back(cur[i]);
                int v1 = solve(vl, cl, f[1], val);
                if (v1 != -1) return v1;
                int v2 = solve(vr, f[0] + r - l, cr, val);
                return v2;
            } else {
                here--;
                if (f[0] + f[1] == 0)
                    return cur[l];
            }
            r++;
        }
        f = !f;
    }
}

int find_best(int n) {
    int val = 0;
    for (int i = 0; i < min(n, G + 1); i++) {
        vi f = check(i);
        if (f[0] + f[1] == 0)
            return i;
        val = max(val, f[0] + f[1]);
        if (val >= 450)
            break;
    }
    vi cur;
    for (int i = 0; i < n; i++)
        cur.push_back(i);
    return solve(cur, 0, 0, val);
}

};

int find_best(int n) {
    return k1r1t0::find_best(n);
}





























#ifdef LOCAL

typedef std::vector<int> ints;
static ints xs;
static int n, cnt;

std::vector<int> ask (int i) {
  assert((0 <= i) && (i < n));
  ints result(2, 0);
  for (int j = 0;  j < n;  j++)
    if (xs[i] > xs[j])
      result[(j > i ? 1 : 0)]++;
  cnt++;
  return result;
}

int main (int argc, char **argv) {
  assert(scanf("%d", &n) == 1);
  xs.resize(n);
  for (int i = 0;  i < n;  i++)
    assert(scanf("%d", &xs[i]) == 1);

  int result = find_best(n);
  printf("%d %d\n", result, cnt);
}
#endif
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...