Submission #1048218

#TimeUsernameProblemLanguageResultExecution timeMemory
1048218pccThe Big Prize (IOI17_prize)C++17
0 / 100
4 ms3672 KiB
#include "prize.h" #include <bits/stdc++.h> using namespace std; #define pii pair<int,int> #define fs first #define sc second const int lim = 5000; const int sq = 500; /* const int lim = 3; const int sq = 5; */ const int mxn = 2e5+10; pii dp[mxn]; int N; int big = 1e9; int ans = 0; bool done = false; pii req(int p){ if(dp[p].fs != -1)return dp[p]; auto re = ask(p); return (dp[p] = pii(re[0],re[1])); } int check(int p){ auto re = req(p); if(!re.fs&&!re.sc)return 0; else if(N-re.fs-re.sc == big)return 2; else return 1; } void dfs(int l,int r,int cnt){ cerr<<"DFS: "<<l<<','<<r<<','<<cnt<<endl; if(done)return; int mid = (l+r)>>1; if(check(mid) == 0){ ans = mid; done = true; return; } if(l == r)return; int ml = mid-1,mr = mid+1; while(ml>=l){ if(check(ml) == 0){ ans = ml; done = true; return; } else if(check(ml) == 1){ ml--; } else break; } while(mr<=r){ if(check(mr) == 0){ ans = mr; done = true; return; } else if(check(mr) == 1){ mr++; } else break; } if(ml>l){ int tmp = req(ml).fs+req(l).sc-(N-big); assert(tmp>=0); if(tmp)dfs(l,ml,tmp); } if(mr<r){ int tmp = req(mr).sc+req(r).fs-(N-big); assert(tmp>=0); if(tmp)dfs(mr,r,tmp); } return; } int find_best(int nn) { N = nn; for(auto &i:dp)i = pii(-1,-1); if(N<=lim){ for(int i = 0;i<N;i++){ auto tmp = req(i); if(!tmp.fs&&!tmp.sc)return i; } assert(false); return 0; } for(int i = 0;i<sq;i++){ auto tmp = req(i); big = min(big,N-tmp.fs-tmp.sc); } cerr<<"BIG: "<<big<<endl; dfs(0,N-1,N-big); assert(done); return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...