Submission #886581

#TimeUsernameProblemLanguageResultExecution timeMemory
886581thinknoexit드문 곤충 (IOI22_insects)C++17
100 / 100
31 ms852 KiB
#include <bits/stdc++.h>
#include "insects.h"
using namespace std;
using ll = long long;
int n;
int sz = 0;
bool mark[2020];
void putin(int x) {
    move_inside(x);
    sz++;
}
void putout(int x) {
    move_outside(x);
    sz--;
}
int val() {
    return press_button();
}
int min_cardinality(int N) {
    n = N;
    vector<int> a(n);
    for (int i = 0;i < n;i++) a[i] = i;
    random_shuffle(a.begin(), a.end());
    putin(a[0]);
    mark[a[0]] = 1;
    for (int i = 1;i < n;i++) {
        putin(a[i]);
        if (val() == 2) {
            putout(a[i]);
        }
        else {
            mark[a[i]] = 1;
        }
    }
    int type = sz;
    if (type == n) return 1;
    int l = 1, r = n / sz;
    while (l < r) {
        int mid = (l + r + 1) / 2;
        stack<int> st, st2;
        for (int i = 0;i < n;i++) {
            if (sz == type * mid) break;
            if (mark[a[i]]) continue;
            putin(a[i]);
            if (val() > mid) {
                putout(a[i]);
                mark[a[i]] = 1;
                st2.push(a[i]);
            }
            else {
                st.push(a[i]);
            }
        }
        if (sz == type * mid) {
            while (!st.empty()) {
                mark[st.top()] ^= 1;
                st.pop();
            }
            while (!st2.empty()) {
                mark[st2.top()] ^= 1;
                st2.pop();
            }
            l = mid;
        }
        else {
            if (l == mid - 1) return l;
            while (!st.empty()) {
                putout(st.top());
                st.pop();
            }
            r = mid - 1;
        }
    }
    return l;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...