답안 #971096

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
971096 2024-04-28T00:45:02 Z maksim1744 드문 곤충 (IOI22_insects) C++17
99.95 / 100
1081 ms 138724 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) {
    set<int> cur;
    map<set<int>, int> mem;
    auto add = [&](int i) {
        if (cur.count(i)) return;
        cur.insert(i);
        move_inside(i);
    };
    auto rem = [&](int i) {
        if (!cur.count(i)) return;
        cur.erase(i);
        move_outside(i);
    };
    auto ask = [&]() -> int {
        if (cur.size() <= 1) return cur.size();
        if (mem.count(cur)) return mem[cur];
        return mem[cur] = press_button();
        // return press_button();
    };
    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 + 0) / 2;
        while (C <= L) ++C;
        while (C >= R) --C;
        int cleft = left.size();
        for (int i : left) {
            add(i);
            if (cur.size() > C - m && ask() > C - m)
                rem(i);
            --cleft;
            if (cur.size() == (C - m) * dif) {
                break;
            }
            if (cur.size() + cleft < (C - m) * dif) {
                for (int u : left)
                    if (u > i)
                        add(u);
                        // cur.insert(u);
                break;
            }
        }
        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;
    while (T--) {
        int C = rnd(1, n);
        // 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 << "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:113:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  113 |     if (cur.size() == n) return 1;
      |         ~~~~~~~~~~~^~~~
insects.cpp:121:27: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  121 |     while (R * cur.size() <= n) ++R;
      |            ~~~~~~~~~~~~~~~^~~~
insects.cpp:130:28: 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() > C - m && ask() > C - m)
      |                 ~~~~~~~~~~~^~~~~~~
insects.cpp:133:28: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  133 |             if (cur.size() == (C - m) * dif) {
      |                 ~~~~~~~~~~~^~~~~~~~~~~~~~~~
insects.cpp:136:36: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  136 |             if (cur.size() + cleft < (C - m) * dif) {
      |                 ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
insects.cpp:144:24: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  144 |         if (cur.size() == (C - m) * dif) {
      |             ~~~~~~~~~~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 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 1 ms 600 KB Output is correct
7 Correct 5 ms 2040 KB Output is correct
8 Correct 6 ms 1880 KB Output is correct
9 Correct 8 ms 1624 KB Output is correct
10 Correct 3 ms 1112 KB Output is correct
11 Correct 3 ms 1160 KB Output is correct
12 Correct 6 ms 1368 KB Output is correct
13 Correct 8 ms 1368 KB Output is correct
14 Correct 5 ms 1424 KB Output is correct
15 Correct 5 ms 1368 KB Output is correct
16 Correct 5 ms 1112 KB Output is correct
17 Correct 7 ms 1880 KB Output is correct
18 Correct 8 ms 1880 KB Output is correct
19 Correct 6 ms 1112 KB Output is correct
20 Correct 9 ms 2136 KB Output is correct
21 Correct 7 ms 1880 KB Output is correct
22 Correct 5 ms 1368 KB Output is correct
# 결과 실행 시간 메모리 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 1 ms 600 KB Output is correct
7 Correct 5 ms 2040 KB Output is correct
8 Correct 6 ms 1880 KB Output is correct
9 Correct 8 ms 1624 KB Output is correct
10 Correct 3 ms 1112 KB Output is correct
11 Correct 3 ms 1160 KB Output is correct
12 Correct 6 ms 1368 KB Output is correct
13 Correct 8 ms 1368 KB Output is correct
14 Correct 5 ms 1424 KB Output is correct
15 Correct 5 ms 1368 KB Output is correct
16 Correct 5 ms 1112 KB Output is correct
17 Correct 7 ms 1880 KB Output is correct
18 Correct 8 ms 1880 KB Output is correct
19 Correct 6 ms 1112 KB Output is correct
20 Correct 9 ms 2136 KB Output is correct
21 Correct 7 ms 1880 KB Output is correct
22 Correct 5 ms 1368 KB Output is correct
23 Correct 7 ms 912 KB Output is correct
24 Correct 162 ms 24352 KB Output is correct
25 Correct 99 ms 15440 KB Output is correct
26 Correct 137 ms 21872 KB Output is correct
27 Correct 41 ms 9264 KB Output is correct
28 Correct 78 ms 12352 KB Output is correct
29 Correct 122 ms 18524 KB Output is correct
30 Correct 175 ms 26424 KB Output is correct
31 Correct 55 ms 11324 KB Output is correct
32 Correct 68 ms 13396 KB Output is correct
33 Correct 100 ms 17552 KB Output is correct
34 Correct 75 ms 13508 KB Output is correct
35 Correct 75 ms 14344 KB Output is correct
36 Correct 89 ms 16808 KB Output is correct
37 Correct 131 ms 20628 KB Output is correct
38 Correct 182 ms 25876 KB Output is correct
39 Correct 207 ms 30820 KB Output is correct
40 Correct 180 ms 24688 KB Output is correct
41 Correct 117 ms 17876 KB Output is correct
# 결과 실행 시간 메모리 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 1 ms 596 KB Output is correct
7 Correct 12 ms 1216 KB Output is correct
8 Correct 923 ms 94752 KB Output is correct
9 Correct 415 ms 60984 KB Output is correct
10 Correct 653 ms 87756 KB Output is correct
11 Correct 147 ms 33212 KB Output is correct
12 Correct 458 ms 72300 KB Output is correct
13 Partially correct 541 ms 70804 KB Output is partially correct
14 Correct 778 ms 97368 KB Output is correct
15 Correct 200 ms 38524 KB Output is correct
16 Correct 252 ms 44312 KB Output is correct
17 Correct 256 ms 42852 KB Output is correct
18 Correct 336 ms 54788 KB Output is correct
19 Correct 322 ms 54560 KB Output is correct
20 Correct 370 ms 56924 KB Output is correct
21 Correct 542 ms 80544 KB Output is correct
22 Correct 829 ms 107988 KB Output is correct
23 Correct 819 ms 107332 KB Output is correct
24 Correct 1081 ms 138724 KB Output is correct
25 Correct 834 ms 97416 KB Output is correct
26 Correct 566 ms 70524 KB Output is correct
27 Correct 697 ms 97844 KB Output is correct
28 Correct 226 ms 37860 KB Output is correct
29 Correct 634 ms 93708 KB Output is correct
30 Correct 709 ms 92328 KB Output is correct
31 Correct 712 ms 96716 KB Output is correct
32 Correct 671 ms 94348 KB Output is correct
33 Correct 819 ms 101516 KB Output is correct
34 Correct 632 ms 100524 KB Output is correct
35 Partially correct 681 ms 96736 KB Output is partially correct
36 Correct 360 ms 56200 KB Output is correct
37 Correct 719 ms 96208 KB Output is correct
38 Correct 759 ms 95840 KB Output is correct
39 Correct 775 ms 105060 KB Output is correct
40 Correct 288 ms 45216 KB Output is correct
41 Correct 450 ms 63084 KB Output is correct
42 Partially correct 770 ms 98972 KB Output is partially correct
43 Correct 19 ms 3336 KB Output is correct
44 Partially correct 133 ms 21020 KB Output is partially correct
45 Correct 115 ms 24996 KB Output is correct
46 Correct 241 ms 71944 KB Output is correct
47 Correct 776 ms 71488 KB Output is correct
48 Correct 417 ms 72120 KB Output is correct