Submission #147561

#TimeUsernameProblemLanguageResultExecution timeMemory
147561GandookSkyscraper (JOI16_skyscraper)C++17
100 / 100
210 ms39160 KiB
#include <bits/stdc++.h> #define SZ(x) (((int)x.size())) typedef long long ll; using namespace std; const int mod = 1000000007, maxn = 110, maxm = 55, maxl = 1*1000+10; int dp[maxn][maxm][maxl][3], n, l, a[maxn], cost; int main() { cin >> n >> l; for (int i = 0; i < n; i++) cin >> a[i]; if (n == 1) { cout << 1; return 0; } sort(a, a + n); for (int i = 0; i <= l; i++) dp[0][0][i][0] = 1; for (int i = 1; i <= n; i++) { for (int j = 1; j <= min(i, (n + 1) / 2); j++) { for (int k = 0; k <= l; k++) { for (int m = 0; m < 3; m++) { cost = (j * 2 - m) * (a[i] - a[i - 1]); if (cost > k) continue; if (m > 0) { dp[i][j][k][m] += (dp[i - 1][j][k - cost][m - 1] * (3 - m)) % mod; dp[i][j][k][m] %= mod; if (i + j + 1 - m <= n) { dp[i][j][k][m] += (dp[i - 1][j - 1][k - cost][m - 1] * (3 - m)) % mod; dp[i][j][k][m] %= mod; } } if (i + j + 1 - m <= n) { dp[i][j][k][m] += ((ll)dp[i - 1][j - 1][k - cost][m] * (j - m)) % mod; dp[i][j][k][m] %= mod; dp[i][j][k][m] += ((ll)dp[i - 1][j][k - cost][m] * (j * 2 - m)) % mod; dp[i][j][k][m] %= mod; } if (j < (n + 1) / 2) { dp[i][j][k][m] += ((ll)dp[i - 1][j + 1][k - cost][m] * j) % mod; dp[i][j][k][m] %= mod; } //cerr << i << " " << j << " " << k << " " << m << " " << dp[i][j][k][m] << endl; } } } } cout << dp[n][1][l][2]; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...