Submission #1294287

#TimeUsernameProblemLanguageResultExecution timeMemory
1294287Zakir060Skyscraper (JOI16_skyscraper)C++20
100 / 100
40 ms23848 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;
const ll MOD = 1000000007;

// dp[i][j][k][z]:
// i – yerləşdirilən bina sayı (ən kiçik i dənə)
// j – bağlı komponentlərin sayı
// k – ümumi məsrəf (boş yerlər a[i] kimi sayılır)
// z – neçə uc (baş/sontam) doldurulub: 0,1,2
ll dp[101][101][1001][3];
ll a[101];

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

    int n, L;
    if (!(cin >> n >> L)) return 0;
    for (int i = 0; i < n; ++i) cin >> a[i];

    sort(a, a + n);

    if (n == 1) {
        cout << 1 << '\n';
        return 0;
    }
    a[n] = 10000;

    int diff0 = a[1] - a[0];

    if (diff0 <= L)
        dp[1][1][diff0][1] = 2;  // 2 uc var

    if (2 * diff0 <= L)
        dp[1][1][2 * diff0][0] = 1;
 for (int i = 1; i < n; ++i) {
        int diff = a[i + 1] - a[i];  // boş yerlərin dəyərinin artımı

        for (int j = 1; j <= i; ++j) {
                for (int k = 0; k <= L; ++k) {
                for (int z = 0; z < 3; ++z) {
                    ll cur = dp[i][j][k][z];
                    if (!cur) continue;

                    if (z < 2) {
                        ll base = k + 1LL * diff * (2 * j - z - 1);
                        if (base <= L) {
                            if (i == n - 1) {
                                dp[i + 1][j][base][z + 1] =
                                    (dp[i + 1][j][base][z + 1] +
                                     cur * (2 - z) * j) % MOD;
                            } else if (z == 0 || j > 1) {
                                dp[i + 1][j][base][z + 1] =
                                    (dp[i + 1][j][base][z + 1] +
                                     cur * (2 - z) * (j - z)) % MOD;
                            }
                        }

                        base = k + 1LL * diff * (2 * j - z + 1);
                        if (base <= L) {
                            dp[i + 1][j + 1][base][z + 1] =
                                (dp[i + 1][j + 1][base][z + 1] +
                                 cur * (2 - z)) % MOD;
                        }
                    }


                    ll base2 = k + 1LL * diff * (2 * j - z + 2);
                    if (base2 <= L) {
                        dp[i + 1][j + 1][base2][z] =
                            (dp[i + 1][j + 1][base2][z] + cur) % MOD;
                    }

                    base2 = k + 1LL * diff * (2 * j - z);
                    if (base2 <= L) {
                        dp[i + 1][j][base2][z] =
                            (dp[i + 1][j][base2][z] +
                             cur * (2 * j - z)) % MOD;
                    }

                    base2 = k + 1LL * diff * (2 * j - z - 2);
                    if (base2 <= L && j >= 2 &&
                        (i == n - 1 || j > 2 || z < 2)) {
                        if (z == 0) {
                            dp[i + 1][j - 1][base2][z] =
                                (dp[i + 1][j - 1][base2][z] +
                                 cur * j * (j - 1)) % MOD;
                        } else if (z == 1) {
                            dp[i + 1][j - 1][base2][z] =
                                (dp[i + 1][j - 1][base2][z] +
                                 cur * (j - 1) * (j - 1)) % MOD;
                        } else {
                            if (i == n - 1) {
                                dp[i + 1][j - 1][base2][z] =
                                    (dp[i + 1][j - 1][base2][z] + cur) % MOD;
                            } else {
                                dp[i + 1][j - 1][base2][z] =
                                    (dp[i + 1][j - 1][base2][z] +
                                     cur * (j - 2) * (j - 1)) % MOD;
                            }
                        }
                    }
                }
            }
        }
    }

    ll ans = 0;
    for (int cost = 0; cost <= L; ++cost) {
        ans = (ans + dp[n][1][cost][2]) % MOD;
    }

    cout << ans << '\n';
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...