Submission #1164757

#TimeUsernameProblemLanguageResultExecution timeMemory
1164757SmuggingSpun커다란 상품 (IOI17_prize)C++20
100 / 100
914 ms11428 KiB
#include<bits/stdc++.h>
#include "prize.h"
using namespace std;
int find_best(int n) {
    vector<vector<int>>cnt(n, vector<int>(2, -1));
    vector<int>used;
    auto id = [&] (int i){
        if(cnt[i][0] != -1){
            return cnt[i];
        }
        used.emplace_back(i);
        return cnt[i] = ask(i);
    };
    auto sum = [&] (int i){
        return id(i)[0] + id(i)[1];
    };
    auto same = [&] (int i, int j){
        return sum(i) == sum(j);
    };
    int ans = -1;
    if(sum(0) == 0){
        ans = 0;
    }
    else if(sum(n - 1) == 0){
        ans = n - 1;
    }
    else{
        function<void(int, int)>solve;
        solve = [&] (int l, int r){
            if(l > r || ans != -1 || (same(l - 1, r + 1) && id(r + 1)[0] - id(l - 1)[0] == 0)){
                return;
            }
            int m = (l + r) >> 1;
            if(sum(m) == 0){
                ans = m;
            }
            bool left = bool(l < m), right = bool(r > m);
            for(int& x : used){
                if(x <= l && same(x, m) && id(m)[0] - id(x)[0] == 0){
                    left = false;
                }
                if(x >= r && same(m, x) && id(m)[1] - id(x)[1] == 0){
                    right = false;
                }
                if(!left && !right){
                    break;
                }
            }
            if(left){
                solve(l, m - 1);
            }
            if(right){
                solve(m + 1, r);
            }
        };
        solve(1, n - 2);
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...