Submission #976873

#TimeUsernameProblemLanguageResultExecution timeMemory
976873LucaIlieThe Big Prize (IOI17_prize)C++17
100 / 100
28 ms2144 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; const int MAX_N = 2e5; int ans[MAX_N][2]; int n, t; bool found = false; int pos; pair<int, int> askk( int i ) { if ( i < 0 || i >= n ) return { -1, -1 }; if ( ans[i][0] == -1 ) { auto x = ask( i ); ans[i][0] = x[0]; ans[i][1] = x[1]; } if ( ans[i][0] + ans[i][1] == 0 ) { found = true; pos = i; } return { ans[i][0], ans[i][1] }; } int findMid( int &l, int &r ) { if ( l > r ) return r; int mid = (l + r) / 2; while ( mid <= r && askk( mid ).first + askk( mid ).second != t && !found ) mid++; if ( mid >= r ) { mid--; while ( mid >= l && askk( mid ).first + askk( mid ).second != t && !found ) mid--; r = mid; return findMid( l, r ); } return mid; } void solve( int l, int r, int tleft, int tright ) { if ( tleft == tright ) return; if ( found ) return; if ( l > r ) return; //printf( "%d %d\n", l, r ); int lmid = (l + r) / 2; while ( lmid >= l && askk( lmid ).first + askk( lmid ).second != t && !found ) lmid--; int tlmid = askk( lmid ).first; int rmid = (l + r) / 2; while ( rmid <= r && askk( rmid ).first + askk( rmid ).second != t && !found ) rmid++; int trmid = askk( rmid ).first; solve( l, lmid, tleft, tlmid ); solve( rmid + 1, r, trmid, tright ); } int find_best( int N ) { n = N; for ( int i = 0; i < n; i++ ) ans[i][0] = ans[i][1] = -1; t = 0; for ( int i = 0; i < 100; i++ ) { int p = rand() % n; t = max( t, askk( p ).first + askk( p ).second ); } solve( 0, n - 1, 0, t ); // for ( int i = 0; i < n; i++ ) // askk( i ); return pos; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...