Submission #1261770

#TimeUsernameProblemLanguageResultExecution timeMemory
1261770nguyenhuythachSkyscraper (JOI16_skyscraper)C++20
100 / 100
64 ms50756 KiB
// solution from usaco #include<bits/stdc++.h> #include<algorithm> #include<random> #include<chrono> #include<cstdlib> #include<ctime> #include<numeric> #include<vector> #include<stack> #include<map> #include<set> #include<queue> #include<iomanip> #define int long long #define ll long long #define L LLONG_MAX #define fi first #define se second #define pii pair<int,int> #define sz(a) ((int)a.size()) #define FOR(i,j,k) for(int i=j;i<=k;i++) #define REP(i,k,j) for(int i=k;i>=j;i--) #define FORD(i,a) for(auto i:a) #define rngdcl mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count()) #define random(l,r) ((l)+(rng()%(r-l+1))) using namespace std; const ll MOD = 1e9 + 7; int n,l; int a[102]; ll dp[102][102][1002][3]; void input() { cin >> n >> l; for (int i = 1; i <= n; i++) cin >> a[i]; } void solve() { if(n==1) { cout << 1; return; } sort(a+1,a+n+1); a[n+1]=10000; dp[0][0][0][0]=1; FOR(i,1,n) FOR(j,1,i) FOR(k,0,l) FOR(m,0,2) { int delta=(2*j-m)*(a[i+1]-a[i]); if(delta>k || i+j+1-m>n) continue; // Case 1 dp[i][j][k][m]+=dp[i-1][j-1][k-delta][m]; // Case 2 if(m) dp[i][j][k][m]+=(3-m)*dp[i-1][j-1][k-delta][m-1]; // Case 3 dp[i][j][k][m]+=(2*j-m)*dp[i-1][j][k-delta][m]; // Case 4 if(m==1) dp[i][j][k][m]+=2*j*dp[i-1][j][k-delta][m-1]; if(m==2) { if(i==n) dp[i][j][k][m]+=dp[i-1][j][k-delta][m-1]; else if(j>1) dp[i][j][k][m]+=(j-1)*dp[i-1][j][k-delta][m-1]; } // Case 5 if(m==2) { if(i==n) dp[i][j][k][m]+=dp[i-1][j+1][k-delta][m]; else dp[i][j][k][m]+=j*(j-1)*dp[i-1][j+1][k-delta][m]; } else if (m==1) dp[i][j][k][m]+=j*j*dp[i-1][j+1][k-delta][m]; else dp[i][j][k][m]+=j*(j+1)*dp[i-1][j+1][k-delta][m]; dp[i][j][k][m]%=MOD; } int ans=0; FOR(i,0,l) ans+=dp[n][1][i][2]; cout << ans%MOD; } signed main() { //freopen(".inp", "r", stdin); //freopen(".out", "w", stdout); ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); input(); solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...