Submission #1223864

#TimeUsernameProblemLanguageResultExecution timeMemory
1223864banganRarest Insects (IOI22_insects)C++20
57.14 / 100
45 ms428 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;

#define pb push_back

// mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());

int n;
int unq;

bool ok(int k) {
    vector<int> in;
    for (int i=0; i<n; i++) {
        move_inside(i);
        if (press_button() > k) move_outside(i);
        else in.pb(i);
    }
    bool ret = unq * k == in.size();
    while (!in.empty()) {
        move_outside(in.back());
        in.pop_back();
    }
    return ret;
}

int min_cardinality(int N) {
    vector<int> in;
    for (int i = 0; i < N; i++) {
        move_inside(i);
        if (press_button() == 2) move_outside(i);
        else in.pb(i);
    }

    unq = in.size();
    while (!in.empty()) {
        move_outside(in.back());
        in.pop_back();
    }

    if (unq <= 9) {
        vector<int> all;
        for (int i=0; i<N; i++) all.pb(i);

        unq--;
        int ans = N;
        while (unq--) {
            vector<int> rem;
            int cur = 0;
            while (!all.empty()) {
                int i = all.back();
                all.pop_back();
                move_inside(i);
                int res = press_button();
                if (res == cur) {
                    move_outside(i);
                    rem.pb(i);
                }
                else {
                    in.pb(i);
                }
                cur = res;
            }
            ans = min(ans, cur);
            all = rem;
            while (!in.empty()) {
                move_outside(in.back());
                in.pop_back();
            }
        }
        return min((int) all.size(), ans);
    }

    n = N;
    int l = 1, r = n / unq;
    while (l != r) {
        int mid = (l+r+1) / 2;
        ok(mid) ? l = mid : r = mid - 1;
    }
    return l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...