Submission #225412

#TimeUsernameProblemLanguageResultExecution timeMemory
225412brcodeSkyscraper (JOI16_skyscraper)C++14
100 / 100
274 ms403960 KiB
#include <iostream> #include <bits/stdc++.h> using namespace std; const long long MAXN = 110; const long long MOD = 1e9+7; long long dp[MAXN][MAXN][1010][5]; long long arr[MAXN]; long long n,L; long long rec(long long i,long long j,long long k,long long l){ //dp[i][j][k][l] = first i numbers, j connected components, k = total sum and l = number of endpolong longs on which numbers have been placed if(i>0 && (j<1||l>2||k>L)){ return 0; } if(i==n){ return (j==1 && l==2); } if(dp[i][j][k][l]!=-1){ return dp[i][j][k][l]; } long long toadd = (arr[i+1]-arr[i])*(2*j-l) + k;//all positions adjacent to existing connected components must be incremented by the difference between adjacent elements in our array dp[i][j][k][l] = 0; dp[i][j][k][l] = (dp[i][j][k][l] + ((2*j-l)%MOD*rec(i+1,j,toadd,l)%MOD)%MOD)%MOD;//add on to an already existing connected component dp[i][j][k][l] = (dp[i][j][k][l] + ((j+1-l)%MOD*rec(i+1,j+1,toadd,l)%MOD)%MOD)%MOD;//add a new connected component dp[i][j][k][l] = (dp[i][j][k][l] + ((2-l)%MOD*rec(i+1,j+1,toadd,l+1)%MOD)%MOD)%MOD;//add a new connected component to an endpolong long dp[i][j][k][l] = (dp[i][j][k][l] + ((2-l)%MOD*rec(i+1,j,toadd,l+1)%MOD)%MOD)%MOD;//extend an already existing connected component to an endpolong long dp[i][j][k][l] = (dp[i][j][k][l] + ((j-1)%MOD*rec(i+1,j-1,toadd,l)%MOD)%MOD)%MOD;//merge 2 connected components return dp[i][j][k][l]; } int main(){ cin>>n>>L; for(long long i=1;i<=n;i++){ cin>>arr[i]; } sort(arr+1,arr+n+1); for(long long i=0;i<=n;i++){ for(long long j=0;j<=n;j++){ for(long long k=0;k<=L;k++){ for(long long l=0;l<=3;l++){ dp[i][j][k][l] = -1; } } } } if(n==1){ cout<<1<<endl; return 0; } cout<<rec(0,0,0,0)<<endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...