Submission #825689

#TimeUsernameProblemLanguageResultExecution timeMemory
825689becaidoRarest Insects (IOI22_insects)C++17
Compilation error
0 ms0 KiB
#pragma GCC optimize("O3,unroll-loops") #pragma GCC target("avx,popcnt,sse4,abm") #include <bits/stdc++.h> using namespace std; #ifndef WAIMAI #include "insects.h" #endif #ifdef WAIMAI #define debug(HEHE...) cout << "[" << #HEHE << "] : ", dout(HEHE) void dout() {cout << '\n';} template<typename T, typename...U> void dout(T t, U...u) {cout << t << (sizeof...(u) ? ", " : ""), dout(u...);} #else #define debug(...) 7122 #endif #define ll long long #define Waimai ios::sync_with_stdio(false), cin.tie(0) #define FOR(x,a,b) for (int x = a, I = b; x <= I; x++) #define pb emplace_back #define F first #define S second #ifdef WAIMAI void move_inside(int i); void move_outside(int i); int press_button(); int min_cardinality(int N); #endif const int SIZE = 2005; const int K = 8; const int S = K; map<int, int> mp; int tag[SIZE], in[SIZE]; int min_cardinality(int N) { int sz = 0; FOR (i, 0, N - 1) { move_inside(i); int mx = press_button(); if (mx == 2) move_outside(i); else { in[i] = 1; tag[i] = 1; sz++; } } mp[1] = sz; if (sz == n) return 1; auto cal = [&](int lim) { if (mp.count(lim)) return mp[lim]; int cnt = 0; FOR (i, 0, N - 1) if (in[i] && tag[i] > lim) { move_outside(i); in[i] = 0; } int need = lim * sz, can = 0; FOR (i, 0, N - 1) can += !in[i]; need -= N - can; FOR (i, 0, N - 1) if (!in[i]) { if (can < need) break; can--; move_inside(i); int mx = press_button(); if (mx > lim) move_outside(i); else { need--; in[i] = 1; tag[i] = mx; } } FOR (i, 0, N - 1) cnt += in[i]; return mp[lim] = cnt; }; int l = 1, r = min(S, N / sz); while (r < N / sz && cal(r) == r * sz) { l = r; r *= K; r = min(r, N / sz); } while (l < r) { int mid = (l + r) / 2 + 1; if (cal(mid) == mid * sz) l = mid; else r = mid - 1; } return l; } /* in1 6 5 8 9 5 9 9 out1 1 7 */ #ifdef WAIMAI static inline constexpr int kMaxQueries = 40000; static int N; // Insect types are compressed to colors in the range [0, N). static vector<int> color; static vector<bool> in_box; static vector<int> color_occurrences; static multiset<int> max_occurrences; static vector<int> op_counter(3, 0); static inline void protocol_violation(string message) { printf("Protocol Violation: %s\n", message.c_str()); exit(0); } void move_inside(int i) { if (i < 0 || i >= N) { protocol_violation("invalid parameter"); } ++op_counter[0]; if (op_counter[0] > kMaxQueries) { protocol_violation("too many calls"); } if (!in_box[i]) { in_box[i] = true; max_occurrences.erase(max_occurrences.find(color_occurrences[color[i]])); ++color_occurrences[color[i]]; max_occurrences.insert(color_occurrences[color[i]]); } } void move_outside(int i) { if (i < 0 || i >= N) { protocol_violation("invalid parameter"); } ++op_counter[1]; if (op_counter[1] > kMaxQueries) { protocol_violation("too many calls"); } if (in_box[i]) { in_box[i] = false; max_occurrences.erase(max_occurrences.find(color_occurrences[color[i]])); --color_occurrences[color[i]]; max_occurrences.insert(color_occurrences[color[i]]); } } int press_button() { ++op_counter[2]; if (op_counter[2] > kMaxQueries) { protocol_violation("too many calls"); } return *(max_occurrences.rbegin()); } int main() { assert(1 == scanf("%d", &N)); color.resize(N); in_box.assign(N, false); map<int, int> type_to_color; for (int i = 0; i < N; ++i) { int Ti; assert(1 == scanf("%d", &Ti)); if (type_to_color.find(Ti) == type_to_color.end()) { int new_color = type_to_color.size(); type_to_color[Ti] = new_color; max_occurrences.insert(0); } color[i] = type_to_color[Ti]; } color_occurrences.assign(type_to_color.size(), 0); int answer = min_cardinality(N); int Q = *max_element(op_counter.begin(), op_counter.end()); printf("%d\n", answer); printf("%d\n", Q); return 0; } #endif

Compilation message (stderr)

insects.cpp: In function 'int min_cardinality(int)':
insects.cpp:53:15: error: 'n' was not declared in this scope
   53 |     if (sz == n) return 1;
      |               ^