제출 #628790

#제출 시각아이디문제언어결과실행 시간메모리
628790phathnvRarest Insects (IOI22_insects)C++17
99.89 / 100
87 ms436 KiB
#include "insects.h"
#include <bits/stdc++.h>

using namespace std;

const int MAX_N = 2000;

bool isIn[MAX_N], nxt[MAX_N];

int ask(const vector<int> &a) {
    for (int i = 0; i < MAX_N; ++i) {
        nxt[i] = 0;
    }
    for (auto x : a) {
        nxt[x] = 1;
    }
    for (int i = 0; i < MAX_N; ++i) {
        if (isIn[i] > nxt[i]) {
            move_outside(i);
        }
        if (isIn[i] < nxt[i]) {
            move_inside(i);
        }
        isIn[i] = nxt[i];
    }
    return press_button();
}

int min_cardinality(int n) {
    vector<int> a(n);
    iota(a.begin(), a.end(), 0);

    vector<int> nxt, inside;
    for (auto x : a) {
        inside.push_back(x);
        if (ask(inside) > 1) {
            inside.pop_back();
            nxt.push_back(x);
        }
    }
    int numDistinct = inside.size();
    int res = 1;
    a = nxt;

    while ((int) a.size() >= numDistinct) {
        int l = 1, r = (int) a.size() / numDistinct;
        int mid = (l + r) >> 1;

        inside.clear();
        vector<int> outside;
        for (auto x : a) {
            inside.push_back(x);
            if (ask(inside) > mid) {
                inside.pop_back();
                outside.push_back(x);
            }
        }
        if ((int)inside.size() == numDistinct * mid) {
            res += mid;
            a = outside;
        } else {
            a = inside;
        }
    }

    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...