제출 #117552

#제출 시각아이디문제언어결과실행 시간메모리
117552nvmdava커다란 상품 (IOI17_prize)C++17
20 / 100
95 ms5452 KiB
#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
vector<int> ask(int i);

vector<int> res[200005];
int ans;
int big, nn;
set<int> lol;
vector<int> query(int i){
   if(res[i].size() == 2)
      return res[i];
   if(i == 0)
      return vector<int>({0, big});
   if(i == nn + 1)
      return vector<int>({big, 0});
   return ask(i - 1);
}

void find(int l, int r){
   if(ans) return;
   if(res[l][0] == res[r][0]) return;
   auto it = lol.find(l);
   while(res[l][0] == res[*it][0]){
      l = *it;
      it++;
   }
   it = lol.find(r);
   while(res[r][0] == res[*it][0]){
      r = *it;
      it--;
   }
   int ll, rr, m = (l + r) >> 1;
   res[m] = query(m);
   if(res[m][0] + res[m][1] == big){
      lol.insert(m);
      find(l, m);
      find(m, r);
      return;
   }

   if(res[m][0] + res[m][1] == 0){
         ans = m;
         return;
   }
   for(rr = m + 1; rr < r; rr++){
      res[rr] = query(rr);
      if(res[rr][0] + res[rr][1] == big){
         lol.insert(rr);
         find(rr, r);
         break;
      }
      if(res[rr][0] + res[rr][1] == 0){
         ans = rr;
         return;
      }
   }
   for(ll = m - 1; ll > l; ll--){
      res[ll] = query(ll);
      if(res[ll][0] + res[ll][1] == big){
         lol.insert(ll);
         find(l, ll);
         break;
      }
      if(res[ll][0] + res[ll][1] == 0){
         ans = ll;
         return;
      }
   }

}

int find_best(int n) {
   nn = n;
	for(int i = 0; i < 3; i++) {
		vector<int> res = ask(i);
		if(res[0] + res[1] == 0)
			return i;
      big = max(big, res[0] + res[1]);
	}
   res[0] = query(0);
   res[nn + 1] = query(nn + 1);
   lol.insert(0);
   lol.insert(nn + 1);

   find(0, nn + 1);

	return ans - 1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...