Submission #964870

#TimeUsernameProblemLanguageResultExecution timeMemory
964870steveonalexRarest Insects (IOI22_insects)C++17
100 / 100
33 ms1212 KiB
#include <bits/stdc++.h>
#include "insects.h"

using namespace std;
 
typedef long long ll;
typedef unsigned long long ull;
 
#define ALL(v) (v).begin(), (v).end()
#define MASK(i) (1LL << (i))
#define GETBIT(mask, i) (((mask) >> (i)) & 1)
 
// mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
mt19937_64 rng(1);
ll rngesus(ll l, ll r){return ((ull) rng()) % (r - l + 1) + l;}
 
ll max(ll a, ll b){return (a > b) ? a : b;}
ll min(ll a, ll b){return (a < b) ? a : b;}
 
ll LASTBIT(ll mask){return mask & (-mask);}
ll pop_cnt(ll mask){return __builtin_popcountll(mask);}
ll ctz(ll mask){return __builtin_ctzll(mask);}
ll clz(ll mask){return __builtin_clzll(mask);}
ll logOf(ll mask){return 63 - clz(mask);}
 
template <class T1, class T2>
    bool minimize(T1 &a, T2 b){
        if (a > b){a = b; return true;}
        return false;
    }
template <class T1, class T2>
    bool maximize(T1 &a, T2 b){
        if (a < b){a = b; return true;}
        return false;
    }
template <class T>
    void printArr(T& a, string separator = " ", string finish = "\n", ostream& out = cout){
        for(auto i: a) out << i << separator;
        out << finish;
    }
template <class T>
    void remove_dup(vector<T> &a){
        sort(ALL(a));
        a.resize(unique(ALL(a)) - a.begin());
    }

// namespace Grader{
//     int n;
//     vector<int> a;
//     set<int> S;
//     int o_cnt[3];

//     void move_inside(int i){
//         o_cnt[0]++;
//         S.insert(i);
//     }

//     void move_outside(int i){
//         o_cnt[1]++;
//         S.erase(i);
//     }

//     int press_button(){
//         o_cnt[2]++;
//         map<int, int> mp;
//         int ans = 0;
//         for(int i: S) {
//             maximize(ans, ++mp[a[i]]);
//         }
//         return ans;
//     }

    int BS(int l, int r, int d_cnt, vector<int> &S, vector<int> space){
        if (l == r) return l;
        int mid = (l + r + 1) >> 1;
        vector<int> left, right;
        for(int i: space){
            if (S.size() == d_cnt * mid) {
                right.push_back(i);
                continue;
            } 
            move_inside(i);
            S.push_back(i);
            if (press_button() > mid) {
                move_outside(i);
                right.push_back(i);
                S.pop_back();
            }
            else left.push_back(i);
        }
        if (S.size() == d_cnt * mid){
            return BS(mid, r, d_cnt, S, right);
        }
        else{
            for(int i: left) {
                move_outside(i);
                S.pop_back();
            }
            return BS(l, mid - 1, d_cnt, S, left);
        }

        return 0;
    }

    int min_cardinality(int n){
        //find number of distinct dud
        vector<int> S;
        for(int i = 0; i<n; ++i){
            move_inside(i);
            S.push_back(i);
            if (i > 0 && press_button() > 1) {
                move_outside(i);
                S.pop_back();
            }
        }

        int d_cnt = S.size();
        sort(ALL(S));
        if (d_cnt == 1) return n;

        vector<int> space;
        for(int i= 0; i<n; ++i) if (!binary_search(ALL(S), i)) space.push_back(i);
        shuffle(ALL(space), rng);
        return BS(1, n / d_cnt, d_cnt, S, space);
    }

//     pair<bool, int> solve(int _n){
//         n = _n;
//         a.resize(n);
//         S.clear();
//         memset(o_cnt, 0, sizeof o_cnt);
//         for(int i = 0; i<n; ++i) a[i] = rngesus(1, 10);

//         int ans = min_cardinality(n);
//         map<int, int> mp;
//         for(int i: a) mp[i]++;
//         int mi = 1e9;
//         for(auto i: mp) minimize(mi, i.second);

//         return make_pair(mi == ans, max({o_cnt[0], o_cnt[1], o_cnt[2]}));
//     }
// }

// int main(void){
//     ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

//     int n = 2000;
//     pair<bool, int> verdict = Grader::solve(n);
//     if (verdict.first) cout << "AC\n";
//     else cout << "WA\n";

//     cout << "Operation cnt: " << verdict.second << "\n";

//     return 0;
// }

Compilation message (stderr)

insects.cpp: In function 'int BS(int, int, int, std::vector<int>&, std::vector<int>)':
insects.cpp:78:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   78 |             if (S.size() == d_cnt * mid) {
      |                 ~~~~~~~~~^~~~~~~~~~~~~~
insects.cpp:91:22: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   91 |         if (S.size() == d_cnt * mid){
      |             ~~~~~~~~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...