Submission #790727

#TimeUsernameProblemLanguageResultExecution timeMemory
790727ttamxThe Big Prize (IOI17_prize)C++14
20 / 100
108 ms12944 KiB
#include "prize.h" #include<bits/stdc++.h> using namespace std; mt19937 rng(time(nullptr)); const int N=2e5+5; struct fenwick{ int t[N]; void add(int i,int v){ i++; while(i<N)t[i]+=v,i+=i&-i; } int read(int i){ i++; int res=0; while(i>0)res+=t[i],i-=i&-i; return res; } }f; int cnt=0; int n; int ans=-1; vector<vector<int>> mem(N); int mx; vector<int> vec; vector<int> ask2(int x){ if(mem[x].empty()){ assert(++cnt<=1e4); mem[x]=ask(x); } return mem[x]; } int bsearch(){ int l=0,r=vec.size()-1; while(l<r){ int mid=(l+r)/2; int m=vec[mid]; auto res=ask2(m); int val=res[0]+res[1]; if(val<mx)return m; if(res[1]-f.read(N-1)+f.read(m)==0){ r=mid-1; }else if(res[0]-f.read(m-1)==0){ l=mid+1; }else if(rng()&1){ r=mid-1; }else{ l=mid+1; } } return vec[l]; } int find_best(int _n) { n=_n; for(int i=0;i<n;i++)vec.emplace_back(i); for(int i=0;i<5;i++){ int x=(rng()%n+n)%n; auto res=ask2(x); mx=max(mx,res[0]+res[1]); } while(ans==-1){ int x=bsearch(); auto res=ask2(x); if(res[0]+res[1]==0)return x; f.add(x,1); vec.erase(lower_bound(vec.begin(),vec.end(),x)); } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...