답안 #971093

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
971093 2024-04-28T00:38:50 Z maksim1744 드문 곤충 (IOI22_insects) C++17
99.89 / 100
1107 ms 139056 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();
    };
    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 (ask() > C - m)
                rem(i);
            --cleft;
            if (cur.size() + cleft < (C - m) * dif) {
                for (int u : left)
                    if (u > i)
                        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:112:20: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  112 |     if (cur.size() == n) return 1;
      |         ~~~~~~~~~~~^~~~
insects.cpp:120:27: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  120 |     while (R * cur.size() <= n) ++R;
      |            ~~~~~~~~~~~~~~~^~~~
insects.cpp:132:36: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  132 |             if (cur.size() + cleft < (C - m) * dif) {
      |                 ~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
insects.cpp:139:24: warning: comparison of integer expressions of different signedness: 'std::set<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  139 |         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 596 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
6 Correct 6 ms 1880 KB Output is correct
7 Correct 6 ms 1624 KB Output is correct
8 Correct 7 ms 1624 KB Output is correct
9 Correct 8 ms 1624 KB Output is correct
10 Correct 4 ms 988 KB Output is correct
11 Correct 4 ms 1112 KB Output is correct
12 Correct 6 ms 1508 KB Output is correct
13 Correct 8 ms 1624 KB Output is correct
14 Correct 6 ms 1368 KB Output is correct
15 Correct 7 ms 1624 KB Output is correct
16 Correct 6 ms 1784 KB Output is correct
17 Correct 7 ms 1620 KB Output is correct
18 Correct 7 ms 1368 KB Output is correct
19 Correct 7 ms 1624 KB Output is correct
20 Correct 8 ms 2468 KB Output is correct
21 Correct 9 ms 1880 KB Output is correct
22 Correct 4 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 596 KB Output is correct
5 Correct 0 ms 344 KB Output is correct
6 Correct 6 ms 1880 KB Output is correct
7 Correct 6 ms 1624 KB Output is correct
8 Correct 7 ms 1624 KB Output is correct
9 Correct 8 ms 1624 KB Output is correct
10 Correct 4 ms 988 KB Output is correct
11 Correct 4 ms 1112 KB Output is correct
12 Correct 6 ms 1508 KB Output is correct
13 Correct 8 ms 1624 KB Output is correct
14 Correct 6 ms 1368 KB Output is correct
15 Correct 7 ms 1624 KB Output is correct
16 Correct 6 ms 1784 KB Output is correct
17 Correct 7 ms 1620 KB Output is correct
18 Correct 7 ms 1368 KB Output is correct
19 Correct 7 ms 1624 KB Output is correct
20 Correct 8 ms 2468 KB Output is correct
21 Correct 9 ms 1880 KB Output is correct
22 Correct 4 ms 1368 KB Output is correct
23 Correct 132 ms 24604 KB Output is correct
24 Correct 168 ms 24356 KB Output is correct
25 Correct 169 ms 25272 KB Output is correct
26 Correct 150 ms 23816 KB Output is correct
27 Correct 71 ms 10648 KB Output is correct
28 Correct 76 ms 12240 KB Output is correct
29 Correct 137 ms 18596 KB Output is correct
30 Correct 175 ms 26716 KB Output is correct
31 Correct 156 ms 24412 KB Output is correct
32 Correct 154 ms 24380 KB Output is correct
33 Correct 147 ms 24452 KB Output is correct
34 Correct 151 ms 24428 KB Output is correct
35 Correct 154 ms 25120 KB Output is correct
36 Correct 155 ms 24656 KB Output is correct
37 Correct 167 ms 25468 KB Output is correct
38 Correct 185 ms 26564 KB Output is correct
39 Correct 205 ms 30444 KB Output is correct
40 Correct 177 ms 24688 KB Output is correct
41 Correct 120 ms 18008 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 0 ms 344 KB Output is correct
7 Correct 604 ms 95424 KB Output is correct
8 Correct 923 ms 95056 KB Output is correct
9 Correct 725 ms 97956 KB Output is correct
10 Correct 676 ms 89588 KB Output is correct
11 Correct 298 ms 40364 KB Output is correct
12 Correct 460 ms 71620 KB Output is correct
13 Partially correct 593 ms 72180 KB Output is partially correct
14 Correct 784 ms 97272 KB Output is correct
15 Correct 696 ms 94940 KB Output is correct
16 Correct 660 ms 95272 KB Output is correct
17 Correct 757 ms 95196 KB Output is correct
18 Correct 649 ms 94964 KB Output is correct
19 Partially correct 629 ms 95644 KB Output is partially correct
20 Correct 652 ms 95024 KB Output is correct
21 Correct 673 ms 94684 KB Output is correct
22 Correct 841 ms 108932 KB Output is correct
23 Correct 830 ms 107016 KB Output is correct
24 Correct 1107 ms 139056 KB Output is correct
25 Correct 878 ms 97396 KB Output is correct
26 Correct 568 ms 70824 KB Output is correct
27 Correct 708 ms 98160 KB Output is correct
28 Correct 676 ms 98060 KB Output is correct
29 Partially correct 678 ms 95356 KB Output is partially correct
30 Partially correct 733 ms 94240 KB Output is partially correct
31 Correct 695 ms 96736 KB Output is correct
32 Correct 686 ms 97276 KB Output is correct
33 Correct 824 ms 101036 KB Output is correct
34 Correct 638 ms 101900 KB Output is correct
35 Partially correct 715 ms 97344 KB Output is partially correct
36 Partially correct 655 ms 96228 KB Output is partially correct
37 Correct 718 ms 96108 KB Output is correct
38 Correct 762 ms 95576 KB Output is correct
39 Correct 782 ms 105452 KB Output is correct
40 Correct 757 ms 104988 KB Output is correct
41 Partially correct 760 ms 99344 KB Output is partially correct
42 Partially correct 827 ms 100212 KB Output is partially correct
43 Correct 21 ms 3420 KB Output is correct
44 Partially correct 157 ms 21288 KB Output is partially correct
45 Correct 575 ms 95936 KB Output is correct
46 Correct 239 ms 71508 KB Output is correct
47 Correct 796 ms 71496 KB Output is correct
48 Correct 429 ms 71552 KB Output is correct