Submission #503847

#TimeUsernameProblemLanguageResultExecution timeMemory
503847pokmui9909Skyscraper (JOI16_skyscraper)C++14
100 / 100
173 ms77188 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;

ll N, L;
ll A[105];
ll D[105][105][1005][3];
const ll MOD = 1e9 + 7;

void add(ll &x, ll y){
    y %= MOD;
    x += y;
    x %= MOD;
}

int main(){
    cin.tie(0) -> sync_with_stdio(false);
    
    cin >> N >> L;
    for(int i = 1; i <= N; i++){
        cin >> A[i];
    }
    if(N == 1){
        cout << 1;
        return 0;
    }
    sort(A + 1, A + N + 1);
    A[N + 1] = 1e5;
    D[0][0][0][0] = 1;
    for(int i = 1; i <= N; i++){
        for(int j = 1; j <= i; j++){
            for(int k = 0; k <= L; k++){
                for(int l = 0; l <= 2; l++){
                    ll C = (2 * j - l) * (A[i + 1] - A[i]);
                    if(C > k) continue;
                    add(D[i][j][k][l], D[i - 1][j - 1][k - C][l]);
                    add(D[i][j][k][l], (2 * j - l) * D[i - 1][j][k - C][l]);
                    if(l >= 1) add(D[i][j][k][l], (3 - l) * D[i - 1][j - 1][k - C][l - 1]);
                    if(l == 1){
                        add(D[i][j][k][l], 2 * j * D[i - 1][j][k - C][l - 1]);
                    } else if(l == 2) {
                        if(i == N){
                            add(D[i][j][k][l], D[i - 1][j][k - C][l - 1]);
                        } else if(j >= 2) {
                            add(D[i][j][k][l], (j - 1) * D[i - 1][j][k - C][l - 1]);
                        }
                    }
                    if(l == 0){
                        add(D[i][j][k][l], j * (j + 1) * D[i - 1][j + 1][k - C][l]);
                    } else if(l == 1) {
                        add(D[i][j][k][l], j * j * D[i - 1][j + 1][k - C][l]);
                    } else {
                        if(i == N){
                            add(D[i][j][k][l], D[i - 1][j + 1][k - C][l]);
                        } else {
                            add(D[i][j][k][l], j * (j - 1) * D[i - 1][j + 1][k - C][l]);
                        }
                    }
                }
            }
        }
    }
    ll ans = 0;
    for(int i = 0; i <= L; i++){
        add(ans, D[N][1][i][2]);
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...