제출 #1118265

#제출 시각아이디문제언어결과실행 시간메모리
1118265vjudge1Skyscraper (JOI16_skyscraper)C++17
100 / 100
99 ms82772 KiB
#include <bits/stdc++.h>

using namespace std;

#define int long long

const int sz=2e5+5;

const int INF=1e18;

const int MOD=1e9+7;

int arr[sz];

int dp[105][105][1005][5];

void solve()
{
    int n,l;
    
    cin>>n>>l;
    
    for(int i=1;i<=n;i++)
        cin>>arr[i];
    
    if(n==1)
    {
        cout<<1;
        
        return;
    }
    
    sort(arr+1,arr+n+1);
    
    arr[n+1]=INF;
    
    dp[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 m=0;m<3;m++)
                {
                    int cost=(2*j-m)*(arr[i+1]-arr[i]);
                    
                    if(cost>k || (i+j+1-m)>n)
                        continue;
                    
                    dp[i][j][k][m]+=dp[i-1][j-1][k-cost][m]+(2*j-m)*dp[i-1][j][k-cost][m];
                    
                    if(m)
                        dp[i][j][k][m]+=(3-m)*dp[i-1][j-1][k-cost][m-1];
                    
                    if(m==1)
                        dp[i][j][k][m]+=j*(2*dp[i-1][j][k-cost][m-1]+j*dp[i-1][j+1][k-cost][m]);
                    
                    else if(m==2)
                    {
                        if(i==n)
                            dp[i][j][k][m]+=dp[i-1][j][k-cost][m-1]+dp[i-1][j+1][k-cost][m];
                        
                        else if(j>1)
                            dp[i][j][k][m]+=(j-1)*dp[i-1][j][k-cost][m-1];
                        
                        if(i!=n)
                            dp[i][j][k][m]+=j*(j-1)*dp[i-1][j+1][k-cost][m];
                    }
                    
                    else
                        dp[i][j][k][m]+=j*(j+1)*dp[i-1][j+1][k-cost][m];
                    
                    dp[i][j][k][m]%=MOD;
                }
            }
        }
    }
    
    int res=0;
    
    for(int i=0;i<=l;i++)
        res+=dp[n][1][i][2];
    
    cout<<res%MOD;
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    
    int t=1;
    
    //cin>>t;
    
    
    while(t--)
    {
        solve();
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...