제출 #347447

#제출 시각아이디문제언어결과실행 시간메모리
347447milleniumEeee커다란 상품 (IOI17_prize)C++17
20 / 100
87 ms492 KiB
#include "prize.h"
#include <bits/stdc++.h>
//#include "grader.cpp"
using namespace std;
typedef vector<int> vi;

mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());

int get_rand() {
  long long x = rnd();
  if (x < 0) {
    x = -x;
  }
  x %= (int)1e9;
  return x;
}

int gen(int l, int r) {
  return l + (get_rand() % (r - l + 1));
}

int f(int n) {
  int p = gen(0, n - 1);
  vector <int> vec = ask(p);
  return vec[0] + vec[1];
} 
 
int find_best(int n) {
  if (n == 1) {
    return 0;
  }
  int S = sqrt(n);
  if (S * S < n) {
    S++;
  }
  int pos = 0;
  int big = 0;
  if (n < 1e5) {
    for (int i = 0; i <= S * 2; i++) {
      vector <int> res = ask(i);
      if (res[0] == 0 && res[1] == 0) {
        return i;
      }
      big = max(big, res[0] + res[1]);
    }
    pos = S + 1;    
  } else {
    for (int i = 1; i <= 10; i++) {
      big = max(big, f(n));      
    }
    pos = 0;
  }
  while(1) {
    vector <int> pres = ask(pos);
    if (pres[0] == 0 && pres[1] == 0) {
      return pos;
    }
    if (pres[0] + pres[1] == big) {
      int l = pos, r = n;
      while(r - l > 1) {
        int mid = (l + r) >> 1; 
        vector <int> mres = ask(mid);
        if (pres[0] == mres[0] && pres[1] == mres[1]) {
          l = mid;
        } else {
          r = mid;
        }
      }
      pos = l + 1;
    } else {
      pos++;
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...