Submission #952760

#TimeUsernameProblemLanguageResultExecution timeMemory
952760DylanSmithSkyscraper (JOI16_skyscraper)C++17
100 / 100
780 ms30488 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define pb push_back #define sz(x) (int)x.size() #define all(x) begin(x),end(x) #define lb(x,y) lower_bound(all(x),y)-begin(x) mt19937 rng; int mod = 1000000007; void solve() { int N, L; cin >> N >> L; vector<int> arr(N); for (int i = 0; i < N; i++) cin >> arr[i]; if (N == 1) { cout << 1 << "\n"; return; } sort(all(arr)); vector<vector<vector<vector<ll>>>> dp(N + 1, vector<vector<vector<ll>>>(L + 1, vector<vector<ll>>(2, vector<ll>(2, 0)))), nxt = dp; dp[0][0][0][0] = 1; for (int i = 0; i < N; i++) { if (i > 0) { for (int j = 0; j <= N; j++) for (int k = 0; k <= L; k++) for (int l = 0; l < 2; l++) for (int r = 0; r < 2; r++) nxt[j][k][l][r] = 0; for (int j = 0; j <= N; j++) { for (int k = 0; k <= L; k++) { for (int l = 0; l < 2; l++) { for (int r = 0; r < 2; r++) { // sum contribution int k2 = k + (arr[i] - arr[i - 1]) * (j * 2 - l - r); if (k2 < 0 || k2 > L) continue; nxt[j][k2][l][r] += dp[j][k][l][r]; if (nxt[j][k2][l][r] >= mod) nxt[j][k2][l][r] -= mod; } } } } swap(dp, nxt); } for (int j = 0; j <= N; j++) for (int k = 0; k <= L; k++) for (int l = 0; l < 2; l++) for (int r = 0; r < 2; r++) nxt[j][k][l][r] = 0; for (int j = 0; j <= N; j++) { for (int k = 0; k <= L; k++) { for (int l = 0; l < 2; l++) { for (int r = 0; r < 2; r++) { // new component if (j < N) { nxt[j + 1][k][l][r] += dp[j][k][l][r] * (j + 1 - l - r); if (l == 0) nxt[j + 1][k][1][r] += dp[j][k][l][r]; if (r == 0) nxt[j + 1][k][l][1] += dp[j][k][l][r]; } // extend component nxt[j][k][l][r] += dp[j][k][l][r] * (2 * j - l - r); if (l == 0) nxt[j][k][1][r] += dp[j][k][l][r]; if (r == 0) nxt[j][k][l][1] += dp[j][k][l][r]; // merge components if (j > 0) nxt[j - 1][k][l][r] += dp[j][k][l][r] * (j - 1); } } } } for (int j = 0; j <= N; j++) { for (int k = 0; k <= L; k++) { for (int l = 0; l < 2; l++) { for (int r = 0; r < 2; r++) { nxt[j][k][l][r] %= mod; } } } } swap(dp, nxt); } ll res = 0; for (int k = 0; k <= L; k++) res += dp[1][k][1][1]; res %= mod; cout << res << "\n"; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); rng = mt19937(chrono::steady_clock::now().time_since_epoch().count()); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...