Submission #722834

#TimeUsernameProblemLanguageResultExecution timeMemory
722834becaidoSuper Dango Maker (JOI22_dango3)C++17
100 / 100
3828 ms716 KiB
#ifndef WAIMAI
#include "dango3.h"
#endif
#include <bits/stdc++.h>
using namespace std;

#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
namespace {

constexpr int Q_MAX = 50'000;
constexpr int NM_MAX = 10'000;

int N;
int M;
int C[NM_MAX + 1];

int query_count = 0;
int answer_count = 0;
bool finishes[NM_MAX + 1];

void WrongAnswer(int code) {
  printf("Wrong Answer [%d]\n", code);
  exit(0);
}
}  // namespace

int Query(const vector<int> &x) {
  if (++query_count > Q_MAX) WrongAnswer(3);
  bool presents[NM_MAX + 1];
  for (int i = 1; i <= N * M; ++i) presents[i] = false;
  int colors[NM_MAX + 1];
  for (int i = 1; i <= N; i++) colors[i] = 0;
  for (const int t : x) {
    if (t <= 0 || t > N * M) WrongAnswer(1);
    if (presents[t]) WrongAnswer(2);
    presents[t] = true;
    colors[C[t]]++;
  }
  int color_min = M;
  for (int i = 1; i <= N; i++) {
    if (colors[i] < color_min) color_min = colors[i];
  }
  return color_min;
}

void Answer(const vector<int> &a) {
  ++answer_count;
  if ((int)a.size() != N) WrongAnswer(4);
  for (const int t : a) {
    if (t <= 0 || t > N * M) WrongAnswer(5);
    if (finishes[t]) WrongAnswer(6);
    finishes[t] = true;
  }
  int colors[NM_MAX + 1];
  for (int i = 1; i <= N; i++) colors[i] = 0;
  for (const int t : a) {
    colors[C[t]]++;
  }
  for (int i = 1; i <= N; i++) {
    if (colors[i] != 1) WrongAnswer(7);
  }
}
#endif

const int SIZE = 1e4 + 5;

namespace {

int sz;
bool vs[SIZE], is[SIZE];
int id[SIZE];

}  // namespace

int q_not(vector<int> v) {
    for (int x : v) is[x] = 1;
    vector<int> qv;
    FOR (i, 1, sz) if (!is[i]) qv.pb(i);
    for (int x : v) is[x] = 0;
    return Query(qv);
}

void Solve(int n, int m) {
    sz = n * m;
    fill(vs + 1, vs + sz + 1, 0);
    iota(id + 1, id + sz + 1, 1);
    mt19937 rng(time(NULL));
    FOR (t, 1, m) {
        shuffle(id + 1, id + sz + 1, rng);
        vector<int> v;
        FOR (i, 1, sz) if (!vs[id[i]] && v.size() < n) {
            v.pb(id[i]);
            int cnt = m - q_not(v);
            if (cnt != 1) v.pop_back();
        }
        Answer(v);
        for (int x : v) vs[x] = 1;
    }
}

#ifdef WAIMAI
int main() {
  if (scanf("%d%d", &N, &M) != 2) {
    fprintf(stderr, "Error while reading input.\n");
    exit(1);
  }
  for (int i = 1; i <= N * M; ++i) {
    if (scanf("%d", &C[i]) != 1) {
      fprintf(stderr, "Error while reading input.\n");
      exit(1);
    }
  }
  for (int i = 1; i <= N * M; ++i) finishes[i] = false;
  Solve(N, M);
  if (answer_count != M) WrongAnswer(8);
  printf("Accepted: %d\n", query_count);
  return 0;
}
#endif

Compilation message (stderr)

dango3.cpp: In function 'void Solve(int, int)':
dango3.cpp:107:51: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  107 |         FOR (i, 1, sz) if (!vs[id[i]] && v.size() < n) {
      |                                          ~~~~~~~~~^~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...