제출 #99217

#제출 시각아이디문제언어결과실행 시간메모리
99217eriksuenderhauf커다란 상품 (IOI17_prize)C++11
97.64 / 100
51 ms5396 KiB
#include <bits/stdc++.h>
#include "prize.h"
#define pii pair<int,innt>
#define vi vector<int>
#define fi first
#define se second
using namespace std;
typedef long long ll;
const int MAXN = 2e5 + 50;
vi ans[MAXN];
int cur = 0;
int ret = -1;

void solve(int l, int r) {
 if (r - l < 2 || ret != -1)
  return;
 if (ans[l][1] == ans[r][1])
  return;
 int m = (l + r) / 2;
 ans[m] = ask(m);
 if (ans[m][0] + ans[m][1] == 0) {
  ret = m;
  return;
 }
 if (ans[m][0] + ans[m][1] != cur) {
  solve(l, m);
  solve(m, r);
  return;
 }
 if (ans[l][0] == ans[m][0] && ans[m][0] == ans[r][0])
  return;
 if (ans[l][0] == ans[m][0])
  solve(m, r);
 else if (ans[l][0] == ans[m][0])
  solve(l, m);
 else {
  solve(l, m);
  if (ret != -1)
   return;
  solve(m, r);
 }
}

int find_best(int n) {
 int val = 454;
 for (int i = 0; i < min(n,455); i++) {
  ans[i] = ask(i);
  if (ans[i][0] + ans[i][1] == 0)
   return i;
  cur = max(cur, ans[i][0] + ans[i][1]);
  if (cur > 100) {
   val = i;
   break;
  }
 }
 if (val < n - 1)
  ans[n-1] = ask(n-1);
 if (ans[n-1][0] + ans[n-1][1] == 0)
  return n-1;
 solve(val,n-1);
 return ret;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...