제출 #617776

#제출 시각아이디문제언어결과실행 시간메모리
617776AbdelmagedNour커다란 상품 (IOI17_prize)C++17
20 / 100
99 ms436 KiB
#include<bits/stdc++.h> using namespace std; #include "prize.h" int MAX,res=-1; bool is_max(vector<int>x){ return x[0]+x[1]==MAX; } void divide(int l,int r){ if(l>r||res!=-1)return; if(l==r){ vector<int>x=ask(l); if(x[0]+x[1]==0)res=l; return; } vector<int>x=ask(l); if(!is_max(x)){ if(x[0]+x[1]==0)res=l; divide(l+1,r); return; } vector<int>y=ask(r); if(!is_max(y)){ if(y[0]+y[1]==0){ res=r; return; } for(int k=__lg(r-l+1);k>=0;k--){ if(l+(1<<k)<r&&ask(l+(1<<k))==x)l+=(1<<k); } divide(l+1,r-1); return; } if(x[0]==y[0]&&x[1]==y[1])return; for(int k=__lg(r-l+1);k>=0;k--){ if(l+(1<<k)<r&&ask(l+(1<<k))==x)l+=(1<<k); } for(int k=__lg(r-l+1);k>=0;k--){ if(r-(1<<k)>l&&ask(r-(1<<k))==x)r-=(1<<k); } int md=(l+r)>>1; divide(l,md); divide(md+1,r); } int find_best(int n){ MAX=0; res=-1; for(int i=0;i<min(n,500);i++){ vector<int>x=ask(i); if(x[0]+x[1]==0)return i; MAX=max(MAX,x[0]+x[1]); } divide(500,n-1); return res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...