Submission #1047249

#TimeUsernameProblemLanguageResultExecution timeMemory
1047249nima_aryanSkyscraper (JOI16_skyscraper)C++17
100 / 100
21 ms6044 KiB
/**
 *    author:  NimaAryan
 *    created: 2024-06-26 20:39:48
**/
#include <bits/stdc++.h>

using namespace std;

#ifdef LOCAL
#include "algo/debug.h"
#endif

using i64 = long long;

constexpr i64 mod = 1E9 + 7;

inline void add(i64& x, i64 y) {
  if ((x += y) >= mod) {
    x -= mod;
  }
}

int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);

  int N, L;
  cin >> N >> L;

  vector<int> A(N);
  for (int i = 0; i < N; ++i) {
    cin >> A[i];
  }

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

  sort(A.begin(), A.end());
  A.push_back(10000);
  vector f(3, vector(1, vector<i64>(L + 1)));
  f[0][0][0] = 1;
  for (int i = 0; i < N; ++i) {
    vector g(3, vector(i + 2, vector<i64>(L + 1)));
    for (int p = 0; p < 3; ++p) {
      for (int c = 0; c <= i; ++c) {
        for (int s = 0; s <= L; ++s) {
          if (!f[p][c][s]) {
            continue;
          }
          int d = A[i + 1] - A[i];
          int new_s = s + (2 * c - p) * d;
          {
            if (c + 1 <= N && 0 <= new_s + 2 * d && new_s + 2 * d <= L) {
              add(g[p][c + 1][new_s + 2 * d], f[p][c][s] * (c + 1 - p) % mod);
            }
            if (0 <= new_s && new_s <= L) {
              add(g[p][c][new_s], f[p][c][s] * (2 * c - p) % mod);
            }
            if (c - 1 >= 1 && 0 <= new_s - 2 * d && new_s - 2 * d <= L) {
              add(g[p][c - 1][new_s - 2 * d], f[p][c][s] * (c - 1) % mod);
            }
          }
          if (p < 2) {
            if (c + 1 <= N && 0 <= new_s + d && new_s + d <= L) {
              add(g[p + 1][c + 1][new_s + d], f[p][c][s] * (2 - p) % mod);
            }
            if (0 <= new_s - d && new_s - d <= L) {
              add(g[p + 1][c][new_s - d], f[p][c][s] * (2 - p) % mod);
            }
          }
        }
      }
    }
    f.swap(g);
  }

  i64 ans = 0;
  for (int l = 0; l <= L; ++l) {
    add(ans, f[2][1][l]);
  }
  cout << ans << "\n";

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...