Submission #1176029


Source Code Expand

#include <cstdio>
#include <algorithm>

using namespace std;

#define REP(i,n)   for(int i=0; i<(int)(n); i++)
#define FOR(i,b,e) for(int i=(b); i<=(int)(e); i++)
#define DUMP(a, n) REP(i, n) printf("%d%c", a[i], i + 1 == n ? '\n' : ' ')
#define DUMP2D(a, n, m) REP(i, n) REP(j, m) printf("%d%c", a[i][j], j + 1 == m ? '\n' : ' '); puts("")

//------------------------------------------------------------------------------
int num_of_bits(int bits)
{
    bits = (bits & 0x55555555) + (bits >> 1 & 0x55555555);
    bits = (bits & 0x33333333) + (bits >> 2 & 0x33333333);
    bits = (bits & 0x0f0f0f0f) + (bits >> 4 & 0x0f0f0f0f);
    bits = (bits & 0x00ff00ff) + (bits >> 8 & 0x00ff00ff);
    return (bits & 0x0000ffff) + (bits >>16 & 0x0000ffff);
}

//------------------------------------------------------------------------------
const int MOD = 1000000007;
const int N = 25;
const int DP_MAX = 1 << 20;

typedef pair<int, int> P;

int x[5][5];

int M;
// dp bit position => next position ([i, j])
P pos[N];
// dp bit count => next value (v)
int vs[N];
// position ([i, j]) => dp bit value
int bit[5][5];
// positions of used values
P xpos[N];

int dp[DP_MAX];

void init() {
  M = 0;
  REP(i, N) vs[i] = i + 1;
  REP(i, 5) REP(j, 5) {
    if (x[i][j] == 0) {
      pos[M] = P(i, j);
      bit[i][j] = 1 << M;
      M++;
    } else {
      vs[x[i][j] - 1] = 0;
      xpos[x[i][j]] = P(i, j);
    }
  }
  int m = 0;
  REP(i, N) if (vs[i] > 0) vs[m++] = vs[i];
}

int next_v(int i) {
  return vs[num_of_bits(i)];
}

int prev_v(int i) {
  if (i == 0) return 0;
  else return vs[num_of_bits(i) - 1];
}

bool used(int i, int a, int b, int v) {
  if (0 < x[a][b] && x[a][b] < v) return true;
  if (i & bit[a][b]) return true;
  return false;
}

bool valid_at(int i, int a, int b, int v) {
  if (0 < a && a < 4)
    if (used(i, a - 1, b, v) != used(i, a + 1, b, v))
      return false;
  if (0 < b && b < 4)
    if (used(i, a, b - 1, v) != used(i, a, b + 1, v))
      return false;
  return true;
}

bool valid(int i, int j) {
  int v0 = prev_v(i);
  int v1 = next_v(i);
  FOR(v, v0 + 1, v1 - 1) {
    P xp = xpos[v];
    int xa = xp.first, xb = xp.second;
    if (!valid_at(i, xa, xb, v)) return false;
  }
  P p = pos[j];
  int a = p.first, b = p.second;
  if (!valid_at(i, a, b, v1)) return false;
  return true;
}

void solve() {
  init();
  int S = 1 << M;
  dp[0] = 1;
  FOR(i, 1, S - 1) {
    REP(j, M) if (i >> j & 1) {
      int i0 = i & ~(1 << j);
      if (valid(i0, j)) dp[i] = (dp[i] + dp[i0]) % MOD;
    }
  }
  printf("%d\n", dp[S - 1]);
}

void input() {
  REP(i, 5) REP(j, 5) scanf("%d", &x[i][j]);
}

int main() {
  input();
  solve();
  return 0;
}

Submission Info

Submission Time
Task D - 25個の整数
User nejiko96
Language C++14 (GCC 5.4.1)
Score 100
Code Size 2661 Byte
Status AC
Exec Time 217 ms
Memory 4224 KB

Compile Error

./Main.cpp: In function ‘void input()’:
./Main.cpp:112:44: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
   REP(i, 5) REP(j, 5) scanf("%d", &x[i][j]);
                                            ^

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 4
AC × 19
AC × 29
Set Name Test Cases
Sample sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt
Subtask1 sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, test-1-01.txt, test-1-02.txt, test-1-03.txt, test-1-04.txt, test-1-05.txt, test-1-06.txt, test-1-07.txt, test-1-08.txt, test-1-09.txt, test-1-10.txt, test-1-11.txt, test-1-12.txt, test-1-13.txt, test-1-14.txt, test-1-15.txt
Subtask2 sample-01.txt, sample-02.txt, sample-03.txt, sample-04.txt, test-1-01.txt, test-1-02.txt, test-1-03.txt, test-1-04.txt, test-1-05.txt, test-1-06.txt, test-1-07.txt, test-1-08.txt, test-1-09.txt, test-1-10.txt, test-1-11.txt, test-1-12.txt, test-1-13.txt, test-1-14.txt, test-1-15.txt, test-2-01.txt, test-2-02.txt, test-2-03.txt, test-2-04.txt, test-2-05.txt, test-2-06.txt, test-2-07.txt, test-2-08.txt, test-2-09.txt, test-2-10.txt
Case Name Status Exec Time Memory
sample-01.txt AC 1 ms 128 KB
sample-02.txt AC 1 ms 128 KB
sample-03.txt AC 1 ms 128 KB
sample-04.txt AC 0 ms 128 KB
test-1-01.txt AC 1 ms 128 KB
test-1-02.txt AC 0 ms 128 KB
test-1-03.txt AC 0 ms 128 KB
test-1-04.txt AC 1 ms 128 KB
test-1-05.txt AC 1 ms 128 KB
test-1-06.txt AC 1 ms 128 KB
test-1-07.txt AC 1 ms 128 KB
test-1-08.txt AC 1 ms 128 KB
test-1-09.txt AC 1 ms 128 KB
test-1-10.txt AC 0 ms 128 KB
test-1-11.txt AC 0 ms 128 KB
test-1-12.txt AC 1 ms 128 KB
test-1-13.txt AC 0 ms 128 KB
test-1-14.txt AC 1 ms 128 KB
test-1-15.txt AC 1 ms 128 KB
test-2-01.txt AC 6 ms 256 KB
test-2-02.txt AC 2 ms 256 KB
test-2-03.txt AC 1 ms 128 KB
test-2-04.txt AC 13 ms 384 KB
test-2-05.txt AC 26 ms 640 KB
test-2-06.txt AC 213 ms 4224 KB
test-2-07.txt AC 205 ms 4224 KB
test-2-08.txt AC 205 ms 4224 KB
test-2-09.txt AC 217 ms 4224 KB
test-2-10.txt AC 198 ms 4224 KB