제출 #1229478

#제출 시각아이디문제언어결과실행 시간메모리
1229478chaeryeong최후의 만찬 (IOI12_supper)C++20
0 / 100
170 ms6432 KiB
#include "advisor.h"
#include <bits/stdc++.h>
using namespace std;

void ComputeAdvice (int *c, int n, int k, int m) {
  vector <int> nxt(n, n), first(n, n);
  for (int i = n - 1; i >= 0; i--) {
    nxt[i] = first[c[i]];
    first[c[i]] = i;
  }
  set <pair <int, int>> ii;
  set <int> jj;
  vector <int> pp(n, -1);
  for (int i = 0; i < k; i++) {
    pp[i] = i;
    ii.insert({first[i], i});
    jj.insert(i);
  }
  vector <int> e(n, 0);
  for (int i = 0; i < n; i++) {
    if (jj.count(c[i])) {
      e[i] = -1; continue;
    }
    auto x = *(--ii.end());
    ii.erase(x); jj.erase(x.second);

    e[i] = pp[x.second];
    assert(e[i] != -1);
    pp[c[i]] = pp[x.second];
    pp[x.second] = -1;

    ii.insert({nxt[i], c[i]});
    jj.insert(c[i]);
  }
  for (int i = 0; i < n; i++) {
    WriteAdvice(e[i] == -1);
  }
  int f = __lg(k) + 1;
  for (int i = 0; i < n; i++) {
    if (e[i] == -1) {
      continue;
    }
    for (int b = 0; b < f; b++) {
      WriteAdvice((e[i] >> b) & 1);
    }
  }
}
#include "assistant.h"
#include <bits/stdc++.h>
using namespace std;

void Assist (unsigned char *a, int n, int k, int r) {
  vector <int> useless(n, 0);
  for (int i = 0; i < n; i++) {
    useless[i] = a[i];
  }
  int f = __lg(k) + 1;
  vector <int> cur(k, 0);
  int bit = n;
  iota(cur.begin(), cur.end(), 0);
  for (int i = 0; i < n; i++) {
    int x = GetRequest();
    if (!useless[i]) {
      int idx = 0;
      for (int j = 0; j < f; j++) {
        if (a[bit++] == 1) {
          idx |= 1 << j;
        }
      }
      PutBack(cur[idx]);
      cur[idx] = x;
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...