제출 #1285545

#제출 시각아이디문제언어결과실행 시간메모리
1285545Faisal_SaqibSkyscraper (JOI16_skyscraper)C++20
100 / 100
169 ms163112 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long const int N=102,L=1002,mod=1e9+7; ll dp[N][N][L][4],a[N]; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); ll n,l; cin>>n>>l; for(int i=1;i<=n;i++) { cin>>a[i]; } if(n==1) { cout<<1<<endl; return 0; } sort(a+1,a+1+n); a[n+1]=a[n]; dp[0][0][0][0]=1; 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++) { ll ac=(a[i+1]-a[i])*(2*j-m);// additonal cost if(k<ac)continue; // new component not at the end dp[i][j][k][m]+=dp[i-1][j-1][k-ac][m]; // new component at one of the end if(m>0) { dp[i][j][k][m]+=(3-m)*dp[i-1][j-1][k-ac][m-1]; } // add to one of the component but not any end dp[i][j][k][m]+=(2*j-m)*dp[i-1][j][k-ac][m]; // add to component and making it end if(m==1) { dp[i][j][k][m]+=j*2*dp[i-1][j][k-ac][m-1]; } else if(m==2) { if(j==1) { if(i==n) { dp[i][j][k][m]+=dp[i-1][j][k-ac][m-1]; } } else { dp[i][j][k][m]+=(j-1)*dp[i-1][j][k-ac][m-1]; } } else { // m==0 not pos } // merge two components // which two to merge // if m==2 if(m==2) { if(j==1) { // we merge one containing the first endpoint and the last endpoint if(i==n) { dp[i][j][k][m]+=dp[i-1][j+1][k-ac][m]; } } else { // we can't merge the first and the last with each other dp[i][j][k][m]+=((j-1)*(j-2)+2*(j-1))*(dp[i-1][j+1][k-ac][m]); } } else if(m==1) { // j + (j-1)*j = j*j dp[i][j][k][m]+=(j*j)*dp[i-1][j+1][k-ac][m]; } else { dp[i][j][k][m]+=(j+1)*(j)*dp[i-1][j+1][k-ac][m]; } dp[i][j][k][m]%=mod; } } } } ll ans=0; for(int i=0;i<=l;i++) { ans+=dp[n][1][i][2]; ans%=mod; } cout<<ans<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...