Submission #1045227

#TimeUsernameProblemLanguageResultExecution timeMemory
1045227beaconmcThe Big Prize (IOI17_prize)C++14
96.79 / 100
253 ms2152 KiB
#include "prize.h" #include <bits/stdc++.h> typedef int ll; #define FOR(i,x,y) for(ll i=x; i<y; i++) #define FORNEG(i,x,y) for(ll i=x; i>y; i--) using namespace std; map<ll, vector<ll>> cache; vector<ll> query(int n){ if (cache.count(n)) return cache[n]; else return cache[n] = ask(n); } int find_best(int n) { cache.clear(); vector<ll> stuff(n); FOR(i,0,n) stuff[i] = i; ll maxi = -1; FOR(i,0,min(500, n)){ vector<ll> sus = query(i); maxi = max(maxi, sus[0]+sus[1]); } vector<ll> found; ll ans = -1; while (ans == -1){ ll lo = 0; ll hi = stuff.size()-1; bool skip = false; while (lo < hi){ ll mid = (lo+hi)/2; FOR(i, max(lo, mid-10000), min(hi, mid+10000)){ if (cache.count(stuff[i])){ mid = i; break; } } vector<ll> sus = query(stuff[mid]); if (sus[0] + sus[1] < maxi){ if (sus[0]+sus[1]==0) return stuff[mid]; found.push_back(stuff[mid]); stuff.erase(stuff.begin()+mid); skip = true; break; }else{ sort(found.begin(), found.end()); ll idk = upper_bound(found.begin(), found.end(), stuff[mid]) - found.begin(); if (idk < sus[0]){ hi = mid; }else{ lo = mid+1; } } } if (skip) continue; vector<ll> sus = query(stuff[lo]); if (sus[0]+sus[1] == maxi) break; if (sus[0]+sus[1]==0) return stuff[lo]; found.push_back(stuff[lo]); stuff.erase(stuff.begin()+lo); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...