Submission #932418

# Submission time Handle Problem Language Result Execution time Memory
932418 2024-02-23T10:14:43 Z nguyentunglam Prisoner Challenge (IOI22_prison) C++17
0 / 100
0 ms 348 KB
#include<bits/stdc++.h>
#include "prison.h"

#include <vector>

using namespace std;

const int N = 6000;

int a[N][10];

int f[30], g[30], bit[30];

int val_bit[30], point[30], pos_bit[30][30];

std::vector<std::vector<int>> devise_strategy(int N) {
  f[0] = 2;
  for(int i = 1; i <= 20; i++) {
    for(int j = 1; j <= i; j++) {
      if (f[i] < f[i - j] * j + 2) {
        f[i] = f[i - j] * j + 2;
        g[i] = j;
      }
    }
  }

  int x = 20, cnt = 0;
  while (x) {
    bit[++cnt] = g[x];
    x -= g[x];
  }

  int n = f[20];

  for(int i = 9; i <= 9; i++) {
    int val = i, l = 1, r = n;
    for(int j = 1; j <= cnt + 1; j++) {
      if (i == l) {
        a[i][j] = -1;
        break;
      }
      if (i == r) {
        a[i][j] = 100;
        break;
      }
      l++; r--;
//      cout << l << " " << r << " " << bit[j] << " " << a[i][j] << endl;
      int ok = (r - l + 1) % bit[j];
      assert(ok == 0);
      int diff = (r - l + 1) / bit[j];
      for(int k = 1; k < bit[j]; k++) {
        if (l + k * diff <= i) a[i][j] = k;
      }
      int pre = l;
      l = pre + a[i][j] * diff;
      r = pre + (a[i][j] + 1) * diff - 1;
    }
  }

  vector<vector<int> > s(21, vector<int> (N + 1, 0));

  for(int i = 1, p = 0, cur = 1; i <= cnt; i++) {
    for(int j = 0; j < bit[i]; j++) {
      s[++p][0] = cur;
      val_bit[p] = j;
      pos_bit[i][j] = p;
      point[p] = i;
    }
    cur ^= 1;
  }

//  for(int i = 0; i <= 20; i++) cout << s[i][0] << " ";

  auto guess = [&] (int st) {
    if (st == 0) return -1;
    return -2;
  };

//  for(int i = 1; i <= cnt; i++) cout << a[9][i] << " "; cout << endl;
//  for(int i = 1; i <= cnt; i++) cout << a[10][i] << " "; cout << endl;

  for(int i = 0; i <= 20; i++) {
    for(int j = 1; j <= N; j++) {
      int x = val_bit[i];
      int y = a[j][point[i]];
      if (x != y && i) {
        int z = x < y ? s[i][0] ^ 1 : s[i][0];
        s[i][j] = guess(z);
      }
      else {
        int send = a[j][point[i] + 1];
        if (send < 0) s[i][j] = guess(s[i][0]);
        else if (send == 100) s[i][j] = guess(s[i][0] ^ 1);
        else s[i][j] = pos_bit[point[i] + 1][send];
      }
    }
  }

  return s;
}

Compilation message

prison.cpp: In function 'std::vector<std::vector<int> > devise_strategy(int)':
prison.cpp:36:9: warning: unused variable 'val' [-Wunused-variable]
   36 |     int val = i, l = 1, r = n;
      |         ^~~
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Strategy failed for N=2, A=1, B=2
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 344 KB Strategy failed for N=2, A=1, B=2
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 0 ms 348 KB Strategy failed for N=3, A=1, B=2
2 Halted 0 ms 0 KB -