Submission #351228

#TimeUsernameProblemLanguageResultExecution timeMemory
351228ryanseeThe Big Prize (IOI17_prize)C++14
94.05 / 100
94 ms3192 KiB
#include "prize.h" #include "bits/stdc++.h" using namespace std; #define FAST ios_base::sync_with_stdio(false); cin.tie(0); #define pb push_back #define eb emplace_back #define ins insert #define f first #define s second #define cbr cerr<<"hi\n" #define mmst(x, v) memset((x), v, sizeof ((x))) #define siz(x) ll(x.size()) #define all(x) (x).begin(), (x).end() #define lbd(x,y) (lower_bound(all(x),y)-x.begin()) #define ubd(x,y) (upper_bound(all(x),y)-x.begin()) mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); //can be used by calling rng() or shuffle(A, A+n, rng) inline long long rand(long long x, long long y) { return rng() % (y+1-x) + x; } //inclusivesss string inline to_string(char c) {string s(1,c);return s;} template<typename T> inline T gcd(T a,T b){ return a==0?llabs(b):gcd(b%a,a); } using ll=long long; using ld=long double; #define FOR(i,s,e) for(int i=s;i<=ll(e);++i) #define DEC(i,s,e) for(ll i=s;i>=ll(e);--i) using pi=pair<ll,ll>; using spi=pair<ll,pi>; using dpi=pair<pi,pi>; long long LLINF = 1e18; int INF = 1e9+1e6; #define MAXN (200006) int n, others, ans=-1, l, r, co2, choice; int memo[MAXN][2]; vector<int> my_ask(int ind) { if(memo[ind][0]==-1) { vector<int> tmp = ask(ind); memo[ind][0] = tmp[0], memo[ind][1] = tmp[1]; } return vector<int>{memo[ind][0], memo[ind][1]}; } void dnc(int s,int e,int many,int infront,int co) { s = max(s, l), e = min(e, r); if(s > e || many == 0) return; ++ co2; if(many == 1) { int st = s-1, en = e; vector<int> memo=my_ask(en); while(en-st>1) { int mid = (st+en) >> 1; vector<int> res = my_ask(mid); if(res[0]+res[1] != others || res[0] - infront) en = mid, memo = res; else st = mid; } if(memo[0]+memo[1]==0) ans=en; if(memo[0]==0) l=en+1; if(memo[1]==0) r=en-1; return; } int mid = (s+e) >> 1, omid = mid; vector<int> res = my_ask(mid); if(res[0] == 0) l=max(l, mid+1); if(res[1] == 0) r=min(r, mid-1); while(res[0]+res[1] != others) { if(res[0]+res[1]==0) ans=mid; if(res[0] == 0) l=max(l, mid+1); if(res[1] == 0) r=min(r, mid-1); if(mid == s) { dnc(omid+1, e, many - (omid - s + 1), infront + (omid - s + 1), co+1); return; } -- mid; res = my_ask(mid); } if((choice == 1 && co%2==0) || (choice == 0 && (co2 & 1))) { dnc(s, mid-1, res[0] - infront, infront, co); dnc(omid+1, e, many - (res[0] - infront) - (omid - mid), res[0] + (omid - mid), !co); } else { dnc(omid+1, e, many - (res[0] - infront) - (omid - mid), res[0] + (omid - mid), !co); dnc(s, mid-1, res[0] - infront, infront, co); } } int find_best(int N) { n = N, r = n-1, mmst(memo, -1); vector<int> p; FOR(i,0,n-1) p.eb(i); FOR(i,0,3) shuffle(all(p), rng); choice = rand(0, 1); FOR(ii,0,min(n-1,473)) { int i=p[ii]; vector<int> res = my_ask(i); others = max(res[0]+res[1], others); if(res[0] == 0) l=max(l, i+1); if(res[1] == 0) r=min(r, i-1); if(res[0]==res[1]&&res[0]==0) return i; } dnc(0, n-1, others, 0, 0), assert(~ans); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...