Submission #1326300

#TimeUsernameProblemLanguageResultExecution timeMemory
1326300sh_qaxxorov_571Skyscraper (JOI16_skyscraper)C++20
0 / 100
1 ms568 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

long long dp[105][105][1005][3];
const int MOD = 1000000007;

int main() {
    int N, L;
    cin >> N >> L;
    vector<int> A(N);
    for (int i = 0; i < N; i++) cin >> A[i];
    sort(A.begin(), A.end());

    if (N == 1) {
        cout << 1 << endl;
        return 0;
    }

    A.push_back(2000); // Guard value
    dp[0][0][0][0] = 1;

    for (int i = 0; i < N; i++) {
        for (int j = 0; j <= i; j++) {
            for (int k = 0; k <= L; k++) {
                for (int e = 0; e <= 2; e++) {
                    if (!dp[i][j][k][e]) continue;

                    int next_k = k + (A[i+1] - A[i]) * (2 * j - e);
                    if (next_k > L) continue;

                    long long cur = dp[i][j][k][e];

                    // 1. Yangi komponent yaratish
                    // Chekkaga qo'ymaslik
                    if (j + 1 <= N)
                        dp[i+1][j+1][next_k][e] = (dp[i+1][j+1][next_k][e] + cur * (j + 1 - e)) % MOD;
                    // Chekkaga qo'yish
                    if (e < 2)
                        dp[i+1][j+1][next_k][e+1] = (dp[i+1][j+1][next_k][e+1] + cur * (2 - e)) % MOD;

                    // 2. Mavjud komponentga qo'shish
                    if (j > 0) {
                        // Bir chekkasiga ulanish
                        dp[i+1][j][next_k][e] = (dp[i+1][j][next_k][e] + cur * (2 * j - e)) % MOD;
                        // Chekkaga ulanish
                        if (e < 2)
                            dp[i+1][j][next_k][e+1] = (dp[i+1][j][next_k][e+1] + cur * (2 - e)) % MOD;
                    }

                    // 3. Ikkita komponentni birlashtirish
                    if (j >= 2) {
                        // Oxirgi qadamda hammasini bitta qilish
                        if (i == N - 1 && j == 2 && e == 2) { /* maxsus holat pastda */ }
                        dp[i+1][j-1][next_k][e] = (dp[i+1][j-1][next_k][e] + cur * (j - 1)) % MOD;
                    }
                }
            }
        }
    }

    long long ans = 0;
    for (int k = 0; k <= L; k++) {
        ans = (ans + dp[N][1][k][2]) % MOD;
    }
    cout << ans << endl;

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