# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1113314 | 2024-11-16T11:12:45 Z | epicci23 | 커다란 상품 (IOI17_prize) | C++17 | 0 ms | 0 KB |
#include "bits/stdc++.h" #include "prize.h" //#define int long long #define all(v) v.begin() , v.end() #define sz(a) (int)a.size() using namespace std; const int S = 100; const int S2 = 20; int ask_all(int l,int r){ for(int i=l;i<=r;i++){ auto x = ask(i); if(x[0]+x[1]==0) return i; } return -23; } int find_best(int n){ if(n<=1000) return ask_all(0,n-1); int L = -1; array<int,2> Cache; for(int i=0;i<500;i++){ array<int,2> x = ask(i); if(x[0]+x[1]==0) return i; if(L==-1){ L=i; Cache=x; } else if(x[0]+x[1]>Cache[0]+Cache[1]){ L=i; Cache=x; } } while(L+S<n){ array<int,2> x = ask(L+S); if(x[0]+x[1]==0) return L+S; if(x[0]+x[1]==Cache[0]+Cache[1] && Cache[1]==x[1]){ L+=S; continue; } int p = L; while(p+S2<L+S){ p+=S2; array<int,2> u = ask(p); if(u[0]+u[1]==0) return p; if(u[0]+u[1]==Cache[0]+Cache[1] && Cache[1]==u[1]) continue; else{ int xd = ask_all(p-S2+1,p-1); if(xd!=-23) return xd; } } int xd = ask_all(p+1,L+S-1); if(xd!=-23) return xd; L+=S; } return ask_all(L+1,n-1); }