Submission #971105

# Submission time Handle Problem Language Result Execution time Memory
971105 2024-04-28T00:58:41 Z maksim1744 Rarest Insects (IOI22_insects) C++17
99.99 / 100
48 ms 12868 KB
/*
    author:  Maksim1744
    created: 28.04.2024 03:07:13
*/

#include "bits/stdc++.h"

using namespace std;

using ll = long long;
using ld = long double;

#define mp   make_pair
#define pb   push_back
#define eb   emplace_back

#define sum(a)     ( accumulate ((a).begin(), (a).end(), 0ll))
#define mine(a)    (*min_element((a).begin(), (a).end()))
#define maxe(a)    (*max_element((a).begin(), (a).end()))
#define mini(a)    ( min_element((a).begin(), (a).end()) - (a).begin())
#define maxi(a)    ( max_element((a).begin(), (a).end()) - (a).begin())
#define lowb(a, x) ( lower_bound((a).begin(), (a).end(), (x)) - (a).begin())
#define uppb(a, x) ( upper_bound((a).begin(), (a).end(), (x)) - (a).begin())

template<typename T>             vector<T>& operator--            (vector<T> &v){for (auto& i : v) --i;            return  v;}
template<typename T>             vector<T>& operator++            (vector<T> &v){for (auto& i : v) ++i;            return  v;}
template<typename T>             istream& operator>>(istream& is,  vector<T> &v){for (auto& i : v) is >> i;        return is;}
template<typename T>             ostream& operator<<(ostream& os,  vector<T>  v){for (auto& i : v) os << i << ' '; return os;}
template<typename T, typename U> pair<T,U>& operator--           (pair<T, U> &p){--p.first; --p.second;            return  p;}
template<typename T, typename U> pair<T,U>& operator++           (pair<T, U> &p){++p.first; ++p.second;            return  p;}
template<typename T, typename U> istream& operator>>(istream& is, pair<T, U> &p){is >> p.first >> p.second;        return is;}
template<typename T, typename U> ostream& operator<<(ostream& os, pair<T, U>  p){os << p.first << ' ' << p.second; return os;}
template<typename T, typename U> pair<T,U> operator-(pair<T,U> a, pair<T,U> b){return mp(a.first-b.first, a.second-b.second);}
template<typename T, typename U> pair<T,U> operator+(pair<T,U> a, pair<T,U> b){return mp(a.first+b.first, a.second+b.second);}
template<typename T, typename U> void umin(T& a, U b){if (a > b) a = b;}
template<typename T, typename U> void umax(T& a, U b){if (a < b) a = b;}

#ifdef HOME
#define SHOW_COLORS
#include "/mnt/c/Libs/tools/print.cpp"
#else
#define show(...) void(0)
#define debugf(fun)   fun
#define debugv(var)   var
#define mclock    void(0)
#define shows     void(0)
#define debug  if (false)
#define OSTREAM(...)    ;
#define OSTREAM0(...)   ;
#endif

void move_inside(int i);
void move_outside(int i);
int press_button();

#ifdef HOUSE
set<int> cur;
vector<int> col;
array<int, 3> que;

void move_inside(int i) {
    ++que[0];
    cur.insert(i);
}

void move_outside(int i) {
    ++que[1];
    cur.erase(i);
}

int press_button() {
    ++que[2];
    map<int, int> u;
    for (int i : cur)
        u[col[i]]++;
    int ans = 0;
    for (auto [a, b] : u)
        ans = max(ans, b);
    return ans;
}
#endif

int min_cardinality(int n) {
    mt19937_64 rng(11112);

    set<int> cur;
    map<string, int> mem;
    string scur(n, '0');

    pair<int, int> pot = {0, 0};

    auto add = [&](int i) {
        if (cur.count(i)) return;
        cur.insert(i);
        scur[i] ^= '0' ^ '1';
        move_inside(i);
        pot.second++;
        pot.second = min(pot.second, (int)cur.size());
    };
    auto rem = [&](int i) {
        if (!cur.count(i)) return;
        cur.erase(i);
        scur[i] ^= '0' ^ '1';
        move_outside(i);
        pot.first--;
        pot.first = max(pot.first, cur.empty() ? 0 : 1);
    };
    auto ask_int = [&]() -> int {
        if (cur.size() <= 1) return cur.size();
        if (mem.count(scur)) return mem[scur];
        return mem[scur] = press_button();
        // return press_button();
    };
    auto ask = [&]() -> int {
        int e = ask_int();
        pot = {e, e};
        return e;
    };
    auto clear = [&]() {
        while (!cur.empty())
            rem(*cur.begin());
    };

    for (int i = 0; i < n; ++i) {
        add(i);
        if (ask() > 1) {
            rem(i);
        }
    }
    if (cur.size() == n) return 1;
    int dif = cur.size();
    set<int> left;
    for (int i = 0; i < n; ++i) {
        left.insert(i);
    }

    int L = 1, R = 1;
    while (R * cur.size() <= n) ++R;
    int m = 0;
    while (R - L > 1) {
        int C = (L + R) / 2;
        while (C <= L) ++C;
        while (C >= R) --C;
        int cleft = left.size();
        set<int> checked;
        vector<int> vleft(left.begin(), left.end());
        shuffle(vleft.begin(), vleft.end(), rng);
        for (int i : vleft) {
            if (cur.size() == (C - m) * dif) {
                break;
            }
            if (cur.size() + cleft < (C - m) * dif) {
                for (int u : left)
                    if (!checked.count(u))
                        add(u);
                        // cur.insert(u);
                break;
            }
            add(i);
            checked.insert(i);
            if (pot.second > C - m && ask() > C - m)
                rem(i);
            --cleft;
        }
        if (cur.size() == (C - m) * dif) {
            for (int i : cur)
                left.erase(i);
            clear();
            L = C;
            m = L;
        } else {
            // for (int i = 0; i < n; ++i) {
            //     if (!cur.count(i))
            //         left.erase(i);
            // }
            left = cur;
            clear();
            R = C;
        }
    }
    return L;
}

#ifdef HOUSE
// mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng(3294793);
ll rnd (ll l, ll r) { return (ll)(rng() % (r - l + 1)) + l; }
ll rnd (ll r)       { return rng() % r; }
ll rnd ()           { return rng(); }
ld rndf()           { return (ld)rng() / (ld)ULLONG_MAX; }
ld rndf(ld l, ld r) { return rndf() * (r - l) + l; }

int main() {
    ios_base::sync_with_stdio(false); cin.tie(NULL);

    int mxq = 0;
    int T = 100000;
    int n = 2000;
    for (int t = 1; t <= T; ++t) {
        rng.seed(t);
        int C = rnd(1, 200);
        // int C = rnd(1, n);
        cur.clear();
        col.resize(n);
        for (int i = 0; i < n; ++i)
            col[i] = rnd(C);
        que.fill(0);

        int ans = 1e9;
        map<int, int> m;
        for (int i : col)
            m[i]++;
        for (auto [a, b] : m)
            ans = min(ans, b);
        int x = min_cardinality(n);
        // cerr <<  "ans=" << ans << " out=" << x << endl;
        // cerr << "que: ";
        // for (int x : que)
        //     cerr << x << ' ';
        // cerr << endl;
        // cerr << fixed << setprecision(3) << (ld)maxe(que) / n << endl;
        show(m);
        assert(ans == x);
        // assert(maxe(que) <= n * 3);
        mxq = max(mxq, maxe(que));
        cerr << "t=" << t << ' ' << "mxq: " << maxe(que) << " " << (ld)mxq / n << ' ' << "C=" << C << endl;
        if (mxq > n * 3) {
            cerr <<  "ans=" << ans << " out=" << x << endl;
            cerr << "que: ";
            for (int x : que)
                cerr << x << ' ';
            cerr << endl;
        }
        assert(mxq <= n * 3);
    }

    return 0;
}
#endif

Compilation message

insects.cpp: In function 'int min_cardinality(int)':
insects.cpp:130:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  130 |     if (cur.size() == n) return 1;
      |         ~~~~~~~~~~~^~~~
insects.cpp:138:27: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  138 |     while (R * cur.size() <= n) ++R;
      |            ~~~~~~~~~~~~~~~^~~~
insects.cpp:149:28: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  149 |             if (cur.size() == (C - m) * dif) {
      |                 ~~~~~~~~~~~^~~~~~~~~~~~~~~~
insects.cpp:152:36: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  152 |             if (cur.size() + cleft < (C - m) * dif) {
      |                 ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
insects.cpp:165:24: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  165 |         if (cur.size() == (C - m) * dif) {
      |             ~~~~~~~~~~~^~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 1 ms 344 KB Output is correct
7 Correct 1 ms 600 KB Output is correct
8 Correct 3 ms 1368 KB Output is correct
9 Correct 3 ms 600 KB Output is correct
10 Correct 3 ms 856 KB Output is correct
11 Correct 1 ms 600 KB Output is correct
12 Correct 3 ms 856 KB Output is correct
13 Correct 3 ms 344 KB Output is correct
14 Correct 2 ms 492 KB Output is correct
15 Correct 3 ms 856 KB Output is correct
16 Correct 3 ms 1112 KB Output is correct
17 Correct 3 ms 600 KB Output is correct
18 Correct 3 ms 856 KB Output is correct
19 Correct 3 ms 856 KB Output is correct
20 Correct 3 ms 952 KB Output is correct
21 Correct 2 ms 344 KB Output is correct
22 Correct 1 ms 600 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 1 ms 344 KB Output is correct
7 Correct 1 ms 600 KB Output is correct
8 Correct 3 ms 1368 KB Output is correct
9 Correct 3 ms 600 KB Output is correct
10 Correct 3 ms 856 KB Output is correct
11 Correct 1 ms 600 KB Output is correct
12 Correct 3 ms 856 KB Output is correct
13 Correct 3 ms 344 KB Output is correct
14 Correct 2 ms 492 KB Output is correct
15 Correct 3 ms 856 KB Output is correct
16 Correct 3 ms 1112 KB Output is correct
17 Correct 3 ms 600 KB Output is correct
18 Correct 3 ms 856 KB Output is correct
19 Correct 3 ms 856 KB Output is correct
20 Correct 3 ms 952 KB Output is correct
21 Correct 2 ms 344 KB Output is correct
22 Correct 1 ms 600 KB Output is correct
23 Correct 7 ms 1624 KB Output is correct
24 Correct 7 ms 2236 KB Output is correct
25 Correct 12 ms 3008 KB Output is correct
26 Correct 18 ms 3912 KB Output is correct
27 Correct 16 ms 2980 KB Output is correct
28 Correct 6 ms 1624 KB Output is correct
29 Correct 14 ms 2968 KB Output is correct
30 Correct 18 ms 3284 KB Output is correct
31 Correct 9 ms 2132 KB Output is correct
32 Correct 11 ms 2396 KB Output is correct
33 Correct 14 ms 2808 KB Output is correct
34 Correct 14 ms 2668 KB Output is correct
35 Correct 12 ms 3084 KB Output is correct
36 Correct 14 ms 2656 KB Output is correct
37 Correct 16 ms 3328 KB Output is correct
38 Correct 17 ms 3460 KB Output is correct
39 Correct 16 ms 3248 KB Output is correct
40 Correct 10 ms 2916 KB Output is correct
41 Correct 6 ms 1880 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 0 ms 344 KB Output is correct
2 Correct 0 ms 344 KB Output is correct
3 Correct 0 ms 344 KB Output is correct
4 Correct 0 ms 344 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
6 Correct 0 ms 344 KB Output is correct
7 Correct 15 ms 4900 KB Output is correct
8 Correct 15 ms 5268 KB Output is correct
9 Correct 36 ms 9124 KB Output is correct
10 Correct 40 ms 11424 KB Output is correct
11 Correct 33 ms 8960 KB Output is correct
12 Correct 22 ms 6508 KB Output is correct
13 Partially correct 34 ms 9768 KB Output is partially correct
14 Correct 39 ms 11168 KB Output is correct
15 Correct 21 ms 6656 KB Output is correct
16 Correct 26 ms 7660 KB Output is correct
17 Correct 28 ms 7224 KB Output is correct
18 Correct 25 ms 7632 KB Output is correct
19 Correct 25 ms 7940 KB Output is correct
20 Correct 30 ms 9228 KB Output is correct
21 Correct 42 ms 11672 KB Output is correct
22 Correct 41 ms 11376 KB Output is correct
23 Correct 42 ms 11956 KB Output is correct
24 Correct 38 ms 11116 KB Output is correct
25 Correct 25 ms 7200 KB Output is correct
26 Correct 14 ms 4708 KB Output is correct
27 Correct 37 ms 9232 KB Output is correct
28 Correct 30 ms 9304 KB Output is correct
29 Correct 29 ms 8176 KB Output is correct
30 Correct 30 ms 8204 KB Output is correct
31 Correct 39 ms 11092 KB Output is correct
32 Correct 43 ms 11368 KB Output is correct
33 Correct 39 ms 12032 KB Output is correct
34 Correct 48 ms 12868 KB Output is correct
35 Correct 33 ms 9516 KB Output is correct
36 Correct 31 ms 9576 KB Output is correct
37 Correct 35 ms 9996 KB Output is correct
38 Correct 41 ms 10852 KB Output is correct
39 Correct 37 ms 10400 KB Output is correct
40 Correct 34 ms 10772 KB Output is correct
41 Correct 32 ms 9968 KB Output is correct
42 Correct 34 ms 9484 KB Output is correct
43 Correct 7 ms 1368 KB Output is correct
44 Correct 29 ms 8548 KB Output is correct
45 Correct 16 ms 5216 KB Output is correct
46 Correct 19 ms 6100 KB Output is correct
47 Correct 20 ms 6372 KB Output is correct
48 Correct 20 ms 6128 KB Output is correct