Submission #710892

#TimeUsernameProblemLanguageResultExecution timeMemory
710892baojiaopisuThe Big Prize (IOI17_prize)C++14
90 / 100
84 ms336 KiB
#include "prize.h" #include<bits/stdc++.h> using namespace std; using ll = long long; using ld = long double; using ull = unsigned long long; using pii = pair<int, int>; using pll = pair<ll, ll>; using pld = pair<ld, ld>; #define fi first #define se second #define left BAO #define right ANH #define pb push_back #define pf push_front #define mp make_pair #define ins insert #define btpc __builtin_popcount #define btclz __builtin_clz #define sz(x) (int)(x.size()); #define all(x) x.begin(), x.end() #define debug(...) " [" << #__VA_ARGS__ ": " << (__VA_ARGS__) << "] " mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); int d4x[4] = {1, 0, -1, 0}; int d4y[4] = {0, 1, 0, -1}; int d8x[8] = {0, 1, 1, 1, 0, -1, -1, -1}; int d8y[8] = {1, 1, 0, -1, -1, -1, 0, 1}; template<class X, class Y> bool minimize(X &x, const Y &y) { if (x > y) { x = y; return true; } return false; } template<class X, class Y> bool maximize(X &x, const Y &y) { if (x < y) { x = y; return true; } return false; } const int MOD = 1e9 + 7; //998244353 template<class X, class Y> void add(X &x, const Y &y) { x = (x + y); if(x >= MOD) x -= MOD; } template<class X, class Y> void sub(X &x, const Y &y) { x = (x - y); if(x < 0) x += MOD; } /* Author : Le Ngoc Bao Anh, 12A5, LQD High School for Gifted Student*/ const ll INF = 1e9; const int N = 1e5 + 10; int find_best(int n) { int pos = 0, rr = 0; vector<int> t; for(int i = 1; i <= 800; i++) { int cc = rng() % n; vector<int> curr = ask(cc); if(curr[0] + curr[1] > rr) pos = cc, rr = curr[0] + curr[1], t = curr; } int p = pos; int iter = pos + 1; while(true) { if(!t[1]) break; int l = iter; int r = n - 1; pos = -1; while(l <= r) { int mid = (l + r) >> 1; vector<int> v = ask(mid); if(v[0] + v[1] < rr) { if(!v[0] && !v[1]) return mid; pos = mid; r = mid - 1; continue; } if(v[1] < t[1]) { r = mid - 1; } else l = mid + 1; } if(pos == -1) break; t[1]--; iter = pos + 1; } iter = p - 1; while(true) { int l = 0; int r = iter; pos = -1; if(!t[0]) break; while(l <= r) { int mid = (l + r) >> 1; vector<int> v = ask(mid); if(v[0] + v[1] < rr) { if(!v[0] && !v[1]) return mid; pos = mid; l = mid + 1; continue; } if(v[0] < t[0]) { l = mid + 1; } else r = mid - 1; } if(pos == -1) break; t[0]--; iter = pos - 1; } assert(false); return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...