Submission #438679

#TimeUsernameProblemLanguageResultExecution timeMemory
438679peijarSkyscraper (JOI16_skyscraper)C++17
20 / 100
2108 ms316924 KiB
#include <bits/stdc++.h> #define int long long using namespace std; const int MOD = 1e9 + 7; int lenPerm, maxSum; int dp[100][1001][101][2][2]; // dp[curPos][curSum][ccCenter][fL][fR]; int diffs[101]; int solve(int curPos, int curSum, int ccCenter, bool fL, bool fR) { if (curSum > maxSum) return 0; int &cur = dp[curPos][curSum][ccCenter][fL][fR]; if (cur != -1) return cur; cur = 0; curSum += fL * diffs[curPos]; curSum += fR * diffs[curPos]; curSum += ccCenter * diffs[curPos] * 2; if (curSum > maxSum) return 0; if (curPos == lenPerm - 1) { if (ccCenter > 0) return 0; if (!fL and !fR) return 0; return cur = 1; } // Create new cc : cur += solve(curPos + 1, curSum, ccCenter + 1, fL, fR); // Create new cc on side : if (!fL) cur += solve(curPos + 1, curSum, ccCenter, true, fR); if (!fR) cur += solve(curPos + 1, curSum, ccCenter, fL, true); // merge center and side : if (fL and ccCenter) cur += ccCenter * solve(curPos + 1, curSum, ccCenter - 1, true, fR); if (fR and ccCenter) cur += ccCenter * solve(curPos + 1, curSum, ccCenter - 1, fL, true); // merge centers : if (ccCenter >= 2) cur += ccCenter * (ccCenter - 1) * solve(curPos + 1, curSum, ccCenter - 1, fL, fR); // add to center : cur += 2 * ccCenter * solve(curPos + 1, curSum, ccCenter, fL, fR); // add to side: if (fL) cur += solve(curPos + 1, curSum, ccCenter, fL, fR); if (fR) cur += solve(curPos + 1, curSum, ccCenter, fL, fR); // Add to center and merge with side : if (!fL) cur += ccCenter * solve(curPos + 1, curSum, ccCenter - 1, true, fR); if (!fR) cur += ccCenter * solve(curPos + 1, curSum, ccCenter - 1, fL, true); cur %= MOD; return cur; } signed main(void) { ios_base::sync_with_stdio(false); cin.tie(0); cin >> lenPerm >> maxSum; for (int i = 0; i < lenPerm; ++i) { cin >> diffs[i]; } sort(diffs, diffs + lenPerm); for (int i = lenPerm - 1; i > 0; --i) diffs[i] -= diffs[i - 1]; if (lenPerm == 1) { cout << 1 << endl; return 0; } for (int i = 0; i < 100; ++i) for (int j = 0; j <= 1000; ++j) for (int k = 0; k <= 100; ++k) for (int l = 0; l < 2; ++l) for (int m = 0; m < 2; ++m) dp[i][j][k][l][m] = -1; cout << solve(0, 0, 0, 0, 0) << endl; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...