제출 #524775

#제출 시각아이디문제언어결과실행 시간메모리
524775obokaman커다란 상품 (IOI17_prize)C++17
20 / 100
116 ms752 KiB
#include <iostream>
#include <vector>
#include <map>
#include "prize.h"

using namespace std;

typedef pair<int,int> pii;
struct Info {
  int higher = 0;
  int leftsum = 0;
  int rightsum = 0;
};

map<int, map<pii, Info>> segments;

int find_best(int n) {
  if (segments.empty()) {
    int m = n/2;
    auto q = ask(m);
    int v = q[0]+q[1];
    if (v == 0) return m;
    segments[v][{0, m}] = Info{q[0], 0, q[1]};
    segments[v][{m+1, n}] = Info{q[1], q[0], 0};
  }
  while (1) {
    auto its = segments.end();
    --its;
    auto& s = its->second;
    double bestp = 0;
    auto bestit = s.end();
    for (auto it = s.begin(); it != s.end(); ++it) {
      int l = it->first.second - it->first.first;
      if (l > 0) {
        double p = ((double)it->second.higher)/l;
        if (p>bestp) {
          bestit = it;
          bestp = p;
        }
      }
    }
    auto x = bestit->first;
    auto oldinfo = bestit->second;
    int m = (x.first+x.second)/2;
    auto q = ask(m);
    int v = q[0] + q[1];
    if (v == 0) return m;
    // fix here, different v.
    s.erase(bestit);
    s[{x.first, m}] = Info{q[0]-oldinfo.leftsum, oldinfo.leftsum, q[1]};
    s[{m+1, x.second}] = Info{q[1]-oldinfo.rightsum, q[0], oldinfo.rightsum};
  }
  return -1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...