제출 #960665

#제출 시각아이디문제언어결과실행 시간메모리
960665MarwenElarbi커다란 상품 (IOI17_prize)C++17
100 / 100
27 ms3104 KiB
#include <bits/stdc++.h>
#include "prize.h"

using namespace std;
std::vector<int> ask(int i);

int ans[200005][2];
int best=-1;
 
void ask2(int i) {
        if(best == i) return;
        
        if(ans[i][0]+ans[i][1] == 0) {
                auto x = ask(i);
                ans[i][0] = x[0];
                ans[i][1] = x[1];
                if(ans[i][0]+ans[i][1] == 0) assert(best==-1), best &= i;
        }
}
 
int rankk(int i) {
        ask2(i);
        return ans[i][0]+ans[i][1];
}
 
int right(int i) {
        ask2(i);
        return ans[i][1];
}
 
 
 
// lower rankk is more rare
void solve(int l, int r) {
        if(best >= 0) return;
        if(r<l) return;
        if(l==r) {
            rankk(l);
            return;
        }
        while(rankk(l) != rankk(r)) {
                while(rankk(l) < rankk(r)) l++;
                while(rankk(l) > rankk(r)) r--;
        }
        if(right(l) == right(r)) return;
        
        int m=(l+r)/2;
        solve(l,m);
        solve(m,r);
}
 
int find_best(int n) {
        solve(0, n-1);
        assert(best >= 0);
        return best;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...