Submission #1173306

#TimeUsernameProblemLanguageResultExecution timeMemory
1173306irmuunSkyscraper (JOI16_skyscraper)C++20
100 / 100
146 ms260632 KiB
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define ff first
#define ss second
#define all(s) s.begin(),s.end()
#define rall(s) s.rbegin(),s.rend()

const ll mod=1e9+7;

ll dp[105][105][1005][3];

void add(ll &a,ll b){
    b%=mod;
    a+=b;
    if(a>=mod) a-=mod;
}

int main(){
    ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    ll n,L;
    cin>>n>>L;
    ll a[n+5];
    for(ll i=0;i<n;i++){
        cin>>a[i];
    }
    if(n==1){
        cout<<1;
        return 0;
    }
    sort(a,a+n);
    const ll inf=1e4;
    a[n]=inf;
    memset(dp,0,sizeof dp);
    if(a[1]-a[0]<=L){
        dp[1][1][a[1]-a[0]][1]=2;
    }
    if(2*(a[1]-a[0])<=L){
        dp[1][1][2*(a[1]-a[0])][0]=1;
    }
    for(ll i=1;i<n;i++){
        ll dif=a[i+1]-a[i];
        for(ll j=1;j<=i;j++){
            for(ll k=0;k<=L;k++){
                for(ll z=0;z<=2;z++){
                    if(dp[i][j][k][z]==0) continue;
                    //one of the end
                    if(z<2&&k+dif*(2*j-z-1)<=L){
                        if(i==n-1){
                            add(dp[i+1][j][k+dif*(2*j-z-1)][z+1],dp[i][j][k][z]*(2-z)*j);
                        }
                        else if(z==0||j>1){//holbogdono
                            add(dp[i+1][j][k+dif*(2*j-z-1)][z+1],dp[i][j][k][z]*(2-z)*(j-z));
                        }
                        if(k+dif*(2*j-z+1)<=L){//holbogdohgui
                            add(dp[i+1][j+1][k+dif*(2*j-z+1)][z+1],dp[i][j][k][z]*(2-z));
                        }
                    }
                    //shine heseg
                    if(k+dif*(2*j-z+2)<=L){
                        add(dp[i+1][j+1][k+dif*(2*j-z+2)][z],dp[i][j][k][z]);
                    }
                    //ali neg hesegtei niilne
                    if(k+dif*(2*j-z)<=L){
                        add(dp[i+1][j][k+dif*(2*j-z)][z],dp[i][j][k][z]*(2*j-z));
                    }
                    //2 heseg holbono
                    if(k+dif*(2*j-z-2)<=L&&j>=2&&(i==n-1||j>2||z<2)){
                        if(z==0){
                            add(dp[i+1][j-1][k+dif*(2*j-z-2)][z],dp[i][j][k][z]*j*(j-1));
                        }
                        if(z==1){
                            add(dp[i+1][j-1][k+dif*(2*j-z-2)][z],dp[i][j][k][z]*(j-1)*(j-1));
                        }
                        if(z==2){
                            if(i==n-1){
                                add(dp[i+1][j-1][k+dif*(2*j-z-2)][z],dp[i][j][k][z]);
                            }
                            else{
                                add(dp[i+1][j-1][k+dif*(2*j-z-2)][z],dp[i][j][k][z]*(j-1)*(j-2));
                            }
                        }
                    }
                }
            }
        }
    }
    ll ans=0;
    for(ll k=0;k<=L;k++){
        add(ans,dp[n][1][k][2]);
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...