답안 #826103

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
826103 2023-08-15T10:27:52 Z becaido 드문 곤충 (IOI22_insects) C++17
컴파일 오류
0 ms 0 KB
#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 id[SIZE], tag[SIZE], in[SIZE];

int min_cardinality(int N) {
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
    iota(id, id + N, 0);
    shuffle(id, id + N, rng);
    int sz = 0;
    FOR (i, 0, N - 1) {
        move_inside(id[i]);
        int mx = press_button();
        if (mx == 2) move_outside(id[i]);
        else {
            in[id[i]] = 1;
            tag[id[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[id[i]] && tag[id[i]] > lim) {
            move_outside(id[i]);
            in[id[i]] = 0;
        }
        FOR (i, 0, N - 1) can += !in[id[i]];
        FOR (i, 0, N - 1) if (!in[id[i]] && tag[id[i]] != -1) {
            move_inside(id[i]);
            int mx = press_button();
            if (mx > lim) move_outside(id[i]);
            else {
                in[id[i]] = 1;
                tag[id[i]] = lim;
            }
        }
        FOR (i, 0, N - 1) cnt += in[id[i]];
        if (cnt < lim * sz) {
            FOR (i, 0, N - 1) if (!in[i]) tag[i] = -1;
        }
        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

insects.cpp: In lambda function:
insects.cpp:65:27: error: 'can' was not declared in this scope; did you mean 'cal'?
   65 |         FOR (i, 0, N - 1) can += !in[id[i]];
      |                           ^~~
      |                           cal