제출 #1261770

#제출 시각아이디문제언어결과실행 시간메모리
1261770nguyenhuythachSkyscraper (JOI16_skyscraper)C++20
100 / 100
64 ms50756 KiB
// solution from usaco 
#include<bits/stdc++.h>
#include<algorithm>
#include<random>
#include<chrono>
#include<cstdlib>
#include<ctime>
#include<numeric>
#include<vector>
#include<stack>
#include<map>
#include<set>
#include<queue>
#include<iomanip>
#define int long long
#define ll long long
#define L LLONG_MAX
#define fi first
#define se second
#define pii pair<int,int>
#define sz(a) ((int)a.size())
#define FOR(i,j,k) for(int i=j;i<=k;i++)
#define REP(i,k,j) for(int i=k;i>=j;i--)
#define FORD(i,a) for(auto i:a)
#define rngdcl mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count())
#define random(l,r) ((l)+(rng()%(r-l+1)))
using namespace std;
const ll MOD = 1e9 + 7;
int n,l;
int a[102];
ll dp[102][102][1002][3];

void input()
{
    cin >> n >> l;
    for (int i = 1; i <= n; i++) cin >> a[i];
}

void solve()
{
    if(n==1)
    {
        cout << 1;
        return;
    }
    sort(a+1,a+n+1);
    a[n+1]=10000;
    dp[0][0][0][0]=1;
    FOR(i,1,n) FOR(j,1,i) FOR(k,0,l) FOR(m,0,2) 
    {
        int delta=(2*j-m)*(a[i+1]-a[i]);
        if(delta>k || i+j+1-m>n) continue;

        // Case 1
        dp[i][j][k][m]+=dp[i-1][j-1][k-delta][m];
        // Case 2
        if(m) dp[i][j][k][m]+=(3-m)*dp[i-1][j-1][k-delta][m-1];
        // Case 3
        dp[i][j][k][m]+=(2*j-m)*dp[i-1][j][k-delta][m];
        // Case 4
        if(m==1) dp[i][j][k][m]+=2*j*dp[i-1][j][k-delta][m-1];
        if(m==2)
        {
            if(i==n) dp[i][j][k][m]+=dp[i-1][j][k-delta][m-1];
            else if(j>1) dp[i][j][k][m]+=(j-1)*dp[i-1][j][k-delta][m-1];
        }
        // Case 5
        if(m==2)
        {
            if(i==n) dp[i][j][k][m]+=dp[i-1][j+1][k-delta][m];
            else dp[i][j][k][m]+=j*(j-1)*dp[i-1][j+1][k-delta][m];
        }
        else if (m==1) dp[i][j][k][m]+=j*j*dp[i-1][j+1][k-delta][m];
        else dp[i][j][k][m]+=j*(j+1)*dp[i-1][j+1][k-delta][m];

        dp[i][j][k][m]%=MOD;
    }

    int ans=0;
    FOR(i,0,l) ans+=dp[n][1][i][2];
    cout << ans%MOD;
}

signed main()
{
    //freopen(".inp", "r", stdin);
    //freopen(".out", "w", stdout);
    ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL);
    input();
    solve();
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...