Submission #131179

#TimeUsernameProblemLanguageResultExecution timeMemory
131179amiratouThe Big Prize (IOI17_prize)C++14
90 / 100
104 ms5376 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; vector<int> dp[200002]; bool check(int med,int idx){ vector<int> res; if(!dp[med].empty())res=dp[med]; else res=ask(med),dp[med]=res; return (dp[idx][0]==res[0]&&dp[idx][1]==res[1]); } int find_best(int n) { int maxi=0,idx=0; for (int i = 0; i < min(477,n); ++i) { dp[i]=ask(i); if(dp[i][0]+dp[i][1]==0)return i; if(dp[i][0]+dp[i][1]>=maxi)maxi=dp[i][0]+dp[i][1],idx=i; } //cerr<<idx<<"\n"; /*for (int i = 0; i <= 0; ++i) { if(dp[i][0]+dp[i][1]==0)return i; if(dp[i][0]+dp[i][1]>=maxi)maxi=dp[i][0]+dp[i][1],idx=i; }*/ while(idx<n){ int l=idx+1,r=n-1,ans=idx; while(l<=r){ int med=(l+r)/2; if(check(med,idx))ans=med,l=med+1; else r=med-1; //cerr<<l<<" "<<r<<"\n"; //cerr<<med<<" "<<(check(med,idx))<<"a\n"; if(med<n&&dp[med][0]+dp[med][1]==0)return med; } ans++; while(ans<n){ vector<int> res; if(!dp[ans].empty())res=dp[ans]; else res=ask(ans),dp[ans]=res; if(dp[ans][0]+dp[ans][1]==0)return ans; if(dp[ans][0]+dp[ans][1]>=maxi){ maxi=dp[ans][0]+dp[ans][1],idx=ans; break; } ans++; } } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...