Submission #698949

#TimeUsernameProblemLanguageResultExecution timeMemory
698949aryan12Rarest Insects (IOI22_insects)C++17
53.16 / 100
179 ms448 KiB
#include "insects.h"
#include <bits/stdc++.h>
using namespace std;

mt19937_64 RNG(chrono::steady_clock::now().time_since_epoch().count());

int min_cardinality(int N) 
{
    int num_insects = 0;
    set<int> s;
    vector<int> order;
    for(int i = 0; i < N; i++)
    {
        order.push_back(i);
    }
    shuffle(order.begin(), order.end(), RNG);
    for(int i = 0; i < N; i++)
    {
        // cout << "moving inside[1]: " << i << endl;
        move_inside(order[i]);
        s.insert(order[i]);
        num_insects++;
        if(press_button() == 2)
        {
            // cout << "moving outside[1]: " << i << endl;
            move_outside(order[i]);
            s.erase(order[i]);
            num_insects--;
        }
    }
    // cout << "num_insects = " << num_insects << endl;
    int l = 2, r = N / num_insects, ans = 1;
    bool flag = true;
    set<int> last_iteration;
    while(l <= r)
    {
        int mid = (l + r) / 2;
        // cout << "mid = " << mid << endl;
        // cout << "s.size() = " << s.size() << endl;
        if(!flag)
        {
            for(auto i: last_iteration)
            {
                // cout << "i = " << i << endl;
                // cout << "moving outside[2]: " << i << endl;
                move_outside(i);
                s.erase(i);
            }
        }
        last_iteration.clear();
        // cout << "hello!" << endl;
        int current_insects = s.size();
        for(int i = 0; i < N; i++)
        {
            if(s.count(order[i])) continue;
            // cout << "moving inside[3]: " << i << endl;
            move_inside(order[i]);
            s.insert(order[i]);
            last_iteration.insert(order[i]);
            current_insects++;
            if(press_button() > mid)
            {
                // cout << "moving outside[3]: " << i << endl;
                move_outside(order[i]);
                s.erase(order[i]);
                last_iteration.erase(order[i]);
                current_insects--;
            }
            if(current_insects == mid * num_insects)
            {
                break;
            }
        }
        // cout << "current_insects = " << current_insects << endl;
        if(current_insects == mid * num_insects)
        {
            ans = mid;
            l = mid + 1;
            flag = true;
        }
        else
        {
            r = mid - 1;
            flag = false;
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...