Submission #1149882

#TimeUsernameProblemLanguageResultExecution timeMemory
1149882windowwifeSkyscraper (JOI16_skyscraper)C++20
100 / 100
45 ms23940 KiB
#include <bits/stdc++.h> #define ll long long #define task "" using namespace std; const int maxn = 102, maxa = 1002, mod = 1e9 + 7, inf = 1e9; ll n, L, d, a[maxn], dp[maxn][maxn][maxa][3], res = 0; void add (ll &a, ll b) { a += b; if (a >= mod) a -= mod; } int main() { //freopen(task".INP", "r", stdin); //freopen(task".OUT", "w", stdout); ios_base::sync_with_stdio(false); cin.tie(nullptr); cin >> n >> L; for (int i = 1; i <= n; i++) cin >> a[i]; if (n == 1) { cout << 1; return 0; } a[n + 1] = inf; sort(a + 1, a + n + 1); //idea : initially fill the empty spaces with a[1] and raise it as we go if (a[2] - a[1] <= L) dp[1][1][a[2] - a[1]][1] = 2; //pos 1 or n if (2*(a[2] - a[1]) <= L) dp[1][1][2*(a[2] - a[1])][0] = 1; //pos 2 -> n - 1 for (int i = 2; i <= n; i++) { d = a[i + 1] - a[i]; for (int j = 1; j < i; j++) { for (int k = 0; k <= L; k++) { for (int l = 0; l < 3; l++) { ll v = dp[i - 1][j][k][l]; if (v == 0) continue; if (l < 2) { if (k + d*(2*j - l + 1) <= L) { add(dp[i][j + 1][k + d*(2*j - l + 1)][l + 1], v*(2 - l)%mod); } //new connected component if (k + d*(2*j - l - 1) <= L) { if (i == n) { add(dp[i][j][k + d*(2*j - l - 1)][l + 1], v*(2 - l)*j%mod); } else if (l == 0 || j > 1) { add(dp[i][j][k + d*(2*j - l - 1)][l + 1], v*(2 - l)*(j - l)%mod); } } //connect to old components } // pos 1 or n if (k + d*(2*j - l + 2) <= L) { add(dp[i][j + 1][k + d*(2*j - l + 2)][l], v); } //new connected component if (k + d*(2*j - l) <= L) { add(dp[i][j][k + d*(2*j - l)][l], v*(2*j - l)%mod); } //connect to old components if (k + d*(2*j - l - 2) <= L && j > 1 && (i == n || j > 2 || l < 2)) { if (l == 0) { add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*j*(j - 1)%mod); } if (l == 1) { add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*(j - 1)*(j - 1)%mod); } if (l == 2) { if (i == n) { add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v); } else { add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*(j - 2)*(j - 1)%mod); } } } //merge 2 components //pos 2 -> n - 1 } } } } for (int i = 0; i <= L; i++) add(res, dp[n][1][i][2]); cout << res; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...