Submission #953044

#TimeUsernameProblemLanguageResultExecution timeMemory
953044waldi커다란 상품 (IOI17_prize)C++17
0 / 100
63 ms6288 KiB
#include "prize.h"
#include <bits/stdc++.h>
#define FOR(i,p,k) for(int i=(p);i<=(k);++i)
#define REP(i,n) FOR(i,0,(n)-1)
#define ssize(x) (int((x).size()))
#define all(x) (x).begin(),(x).end()
using namespace std;

int find_best(int n){
	vector<vector<int>> tab(n);
	auto zapytaj = [&](int i){
		if(tab[i].empty()) tab[i] = ask(i);
		return tab[i];
	};
	
	if(n <= 5000){
		REP(i, n) if(zapytaj(i)[0]+zapytaj(i)[1] == 0) return i;
		return -69;
	}
	
	int maks = 0;
	REP(i, min(n, 500)){
		int t = zapytaj(i)[0] + zapytaj(i)[1];
		if(!t) return i;
		maks = max(maks, t);
	}
	
	int wynik = -1;
	function<void(int, int, int, int)> zwyciezaj = [&](int p, int k, int przed, int tutaj){
		if(wynik>=0 || p>k || !tutaj) return;
		int sr_org = (p+k)>>1;
		
		int sr = sr_org, lewo = 0;
		vector<int> t = zapytaj(sr);
		while(1){
			if(t[0]+t[1] == 0) return void(wynik = sr);
			if(t[0]+t[1] < maks) break;
			--sr;
			if(sr < p) break;
			t = zapytaj(sr);
		}
		lewo = t[0]-przed;
		
		int roz = sr_org-sr;
		zwyciezaj(p, sr-1, przed, lewo);
		zwyciezaj(sr_org+1, k, przed+lewo+roz, tutaj-lewo-roz);
	};
	zwyciezaj(0, n-1, 0, maks);
	return wynik;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...