Submission #172358

#TimeUsernameProblemLanguageResultExecution timeMemory
172358AlexLuchianov커다란 상품 (IOI17_prize)C++14
20 / 100
92 ms424 KiB
#include "prize.h" #include <cmath> #include <iostream> #include <cassert> using ll = long long; #define MIN(a, b) (((a) < (b)) ? (a) : (b)) #define MAX(a, b) (((a) < (b)) ? (b) : (a)) int identity = 0, diamond = -1; std::vector<int> realask(int x){ std::vector<int> sol = ask(x); if(sol[0] + sol[1] == 0) diamond = x; return sol; } void solve(int from, int to, int left, int right){ ///invalid interval if(to < from) { return ; } ///no special element here :( if(identity == left + right) { return ; } ///diamond was already found if(0 <= diamond) { return ; } int mid = (from + to) / 2; std::vector<int> sol = realask(mid); if(sol[0] + sol[1] == identity){ solve(from, mid - 1, left, sol[1]); solve(mid + 1, to, sol[0], right); } else { int mid2 = mid + 1; while(mid2 <= to){ sol = realask(mid2); if(sol[0] + sol[1] == identity) { solve(mid2 + 1, to, sol[0], right); break; } mid2++; } mid2 = mid - 1; while(from <= mid2){ sol = realask(mid2); if(sol[0] + sol[1] == identity){ solve(from, mid2 - 1, left, sol[1]); break; } mid2--; } } } int find_best(int n) { int special = 0; int n2 = sqrt(n); while(1 <= n2){ special += n2; n2 = sqrt(n2 - 1); } //special = 0; //std::cout << n << " " << special << '\n'; //assert(special <= 800); special = 100; for(int i = 0;i < MIN(special + 1, n - 1); i++){ std::vector<int> sol = realask(i); identity = MAX(identity, sol[0] + sol[1]); } solve(MIN(special + 1, n - 1), n - 1, 0, 0); assert(0 <= diamond); return diamond; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...