답안 #498605

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
498605 2021-12-25T17:39:57 Z 600Mihnea Skyscraper (JOI16_skyscraper) C++17
20 / 100
2000 ms 31948 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int M = (int) 1e9 + 7;

int add(int a, int b) {
  a += b;
  if (a >= M) return a - M;
  if (a < 0) return a + M;
  return a;
}

int mul(int a, int b) {
  return a * (ll) b % M;
}

void addup(int &a, int b) {
  a = add(a, b);
}

void mulup(int &a, int b) {
  a = mul(a, b);
}

const int N = 100 + 7;
const int Z = 5000 + 7;
int n;
int limit;
int a[N];
int dp[N][2 * Z][2][2]; /// ways[islands][sum]
int nwdp[N][2 * Z][2][2];

void rst() {
  for (int i = 0; i <= n; i++) {
    for (int j = 0; j < 2 * Z; j++) {
      for (int bg = 0; bg < 2; bg++) {
        for (int nd = 0; nd < 2; nd++) {
          dp[i][j][bg][nd] = nwdp[i][j][bg][nd];
          nwdp[i][j][bg][nd] = 0;
        }
      }
    }
  }
}

void addTo(int islands, int real_sum, int bg, int nd, int value) {
  if (islands >= 1 && -(Z - 1) <= real_sum && real_sum <= (Z - 1)) {
    addup(nwdp[islands][real_sum + Z][bg][nd], value);
  }
}

int main() {
  bool isHome;

  isHome = true;
  isHome = false;

  if (isHome) {
    freopen ("input", "r", stdin);
  } else {
    ios::sync_with_stdio(0); cin.tie(0);
  }


  cin >> n >> limit;


  if (n == 1) {
    cout << "1\n";
    return 0;
  }

  for (int i = 1; i <= n; i++) {
    cin >> a[i];
  }
  sort(a + 1, a + n + 1);

  /// it is the first

  dp[1][Z - a[1]][1][0] = 1;

  /// it is the last


  dp[1][Z - a[1]][0][1] = 1;

  /// it is in the middle


  dp[1][Z - 2 * a[1]][0][0] = 1;

  for (int it = 2; it <= n; it++) {
    int x = a[it];
    for (int islands = 1; islands < it; islands++) {
      for (int sum = -(Z - 1); sum <= (Z - 1); sum++) {
        for (int bg = 0; bg < 2; bg++) {
          for (int nd = 0; nd < 2; nd++) {
            int dp_value = dp[islands][sum + Z][bg][nd];
            if (dp_value == 0) {
              continue;
            }

            { /// create a new island

              /// make it the first

              if (bg == 0) {
                addTo(islands + 1, sum - x, 1, nd, dp_value);
              }

              /// make it the last

              if (nd == 0) {
                addTo(islands + 1, sum - x, bg, 1, dp_value);
              }

              /// place it in the middle

              int total_ways = (islands + 1) - bg - nd;

              addTo(islands + 1, sum - 2 * x, bg, nd, mul(dp_value, total_ways));

            }

            { /// put it next to some guy


              /// make it the first

              if (bg == 0) {
                addTo(islands, sum + x, 1, nd, dp_value);
              }

              /// make it the last

              if (nd == 0) {
                addTo(islands, sum + x, bg, 1, dp_value);
              }


              /// place it in the middle

              int total_ways = 2 * islands - bg - nd;

              addTo(islands, sum, bg, nd, mul(dp_value, total_ways));

            }

            if (islands >= 2) { /// join some guys

              int total_ways = (islands - 1);

              addTo(islands - 1, sum + 2 * x, bg, nd, mul(dp_value, total_ways));
            }

          }
        }
      }
    }
    rst();
  }


  int sol = 0;

  for (int sum = 0; sum <= limit; sum++) {
    int dp_value = dp[1][sum + Z][1][1];
    if (dp_value) {
      addup(sol, dp_value);
    }
  }

  cout << sol << "\n";


  return 0;
}

Compilation message

skyscraper.cpp: In function 'int main()':
skyscraper.cpp:62:13: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   62 |     freopen ("input", "r", stdin);
      |     ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 1228 KB Output is correct
3 Correct 1 ms 1484 KB Output is correct
4 Correct 4 ms 2508 KB Output is correct
5 Correct 6 ms 3020 KB Output is correct
6 Correct 6 ms 3148 KB Output is correct
7 Correct 6 ms 3020 KB Output is correct
8 Correct 6 ms 3020 KB Output is correct
9 Correct 7 ms 3020 KB Output is correct
10 Correct 6 ms 3028 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 11 ms 4300 KB Output is correct
2 Correct 18 ms 5028 KB Output is correct
3 Correct 15 ms 4940 KB Output is correct
4 Correct 18 ms 4940 KB Output is correct
5 Correct 19 ms 4940 KB Output is correct
6 Correct 17 ms 5028 KB Output is correct
7 Correct 17 ms 5032 KB Output is correct
8 Correct 15 ms 5024 KB Output is correct
9 Correct 17 ms 5028 KB Output is correct
10 Correct 16 ms 4940 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 0 ms 204 KB Output is correct
2 Correct 1 ms 1228 KB Output is correct
3 Correct 1 ms 1484 KB Output is correct
4 Correct 4 ms 2508 KB Output is correct
5 Correct 6 ms 3020 KB Output is correct
6 Correct 6 ms 3148 KB Output is correct
7 Correct 6 ms 3020 KB Output is correct
8 Correct 6 ms 3020 KB Output is correct
9 Correct 7 ms 3020 KB Output is correct
10 Correct 6 ms 3028 KB Output is correct
11 Correct 11 ms 4300 KB Output is correct
12 Correct 18 ms 5028 KB Output is correct
13 Correct 15 ms 4940 KB Output is correct
14 Correct 18 ms 4940 KB Output is correct
15 Correct 19 ms 4940 KB Output is correct
16 Correct 17 ms 5028 KB Output is correct
17 Correct 17 ms 5032 KB Output is correct
18 Correct 15 ms 5024 KB Output is correct
19 Correct 17 ms 5028 KB Output is correct
20 Correct 16 ms 4940 KB Output is correct
21 Correct 170 ms 13168 KB Output is correct
22 Correct 1128 ms 25072 KB Output is correct
23 Execution timed out 2043 ms 31948 KB Time limit exceeded
24 Halted 0 ms 0 KB -