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...