Submission #1172480

#TimeUsernameProblemLanguageResultExecution timeMemory
1172480AlgorithmWarriorSkyscraper (JOI16_skyscraper)C++20
100 / 100
156 ms60432 KiB
#include <bits/stdc++.h>

using namespace std;

int const MOD=1e9+7;
int dp[105][105][3][1005];
int delta[105];
int n,sum;

void read(){
    cin>>n>>sum;
    int i;
    for(i=1;i<=n;++i)
        cin>>delta[i];
    sort(delta+1,delta+n+1);
    for(i=n;i;--i)
        delta[i]-=delta[i-1];
}

void add(int& x,int val){
    x=(x+val)%MOD;
}

int get_dp(){
    if(n==1)
        dp[1][1][2][0]=1;
    if(n>=2)
        dp[1][1][1][0]=2;
    if(n>=3)
        dp[1][1][0][0]=1;
    int i,j,s,cap;
    for(i=2;i<=n;++i)
        for(j=1;j<=i;++j)
            for(s=0;s<=sum;++s)
                for(cap=0;cap<3;++cap){
                    if(s-delta[i]*(2*j-2-cap)>=0 && j-cap>=0 && 2*j-2-cap>=0)
                        add(dp[i][j][cap][s],1LL*(j-cap)*dp[i-1][j-1][cap][s-delta[i]*(2*j-2-cap)]%MOD);
                    if(s-delta[i]*(2*j-cap)>=0)
                        add(dp[i][j][cap][s],1LL*(2*j-cap)*dp[i-1][j][cap][s-delta[i]*(2*j-cap)]%MOD);
                    if(s-delta[i]*(2*j+2-cap)>=0)
                        add(dp[i][j][cap][s],1LL*j*dp[i-1][j+1][cap][s-delta[i]*(2*j+2-cap)]%MOD);
                    if(cap && s-delta[i]*(2*j-cap+1)>=0)
                        add(dp[i][j][cap][s],1LL*(3-cap)*dp[i-1][j][cap-1][s-delta[i]*(2*j-cap+1)]%MOD);
                    if(cap && s-delta[i]*(2*j-1-cap)>=0 && 2*j-1-cap>=0)
                        add(dp[i][j][cap][s],1LL*(3-cap)*dp[i-1][j-1][cap-1][s-delta[i]*(2*j-1-cap)]%MOD);
                }
    int ans=0;
    for(i=0;i<=sum;++i)
        add(ans,dp[n][1][2][i]);
    return ans;
}

int main()
{
    read();
    cout<<get_dp();
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...