Submission #1168827

#TimeUsernameProblemLanguageResultExecution timeMemory
1168827WarinchaiSkyscraper (JOI16_skyscraper)C++20
15 / 100
1 ms1608 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;
vector<int>h;
int dp[105][105][1005][3];
int md=1e9+7;
int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    int n,l;cin>>n>>l;
    for(int i=1;i<=n;i++){
        int a;cin>>a;
        h.push_back(a);
    }
    h.push_back(0);
    sort(h.begin(),h.end());
    dp[0][0][0][0]=1;
    dp[1][1][0][0]=1;
    dp[1][1][0][1]=2;
    for(int i=1;i<n;i++){
        for(int j=1;j<=n;j++){
            for(int k=0;k<=l;k++){
                for(int m=0;m<3;m++){
                    int cost=k+(h[i+1]-h[i])*(2*j-m);
                    if(cost>l)continue;
                    //add middle component
                    dp[i+1][j+1][cost][m]+=dp[i][j][k][m]*(j-m+1);
                    dp[i+1][j+1][cost][m]%=md;
                    //add end component
                    dp[i+1][j+1][cost][m+1]+=dp[i][j][k][m]*(2-m);
                    dp[i+1][j+1][cost][m+1]%=md;
                    //append to component in middle
                    dp[i+1][j][cost][m]+=dp[i][j][k][m]*(2*j-m);
                    dp[i+1][j][cost][m]%=md;
                    //append to component at end
                    dp[i+1][j][cost][m+1]+=dp[i][j][k][m]*(2-m);
                    dp[i+1][j][cost][m+1]%=md;
                    //merge component
                    dp[i+1][j-1][cost][m]+=dp[i][j][k][m]*(j-1);
                    dp[i+1][j-1][cost][m]%=md;
                }
            }
        }
    }
    int ans=0;
    for(int i=0;i<=l;i++)ans+=dp[n][1][i][2],ans%=md;
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...