Submission #1079275

#TimeUsernameProblemLanguageResultExecution timeMemory
1079275boris_mihovSkyscraper (JOI16_skyscraper)C++17
100 / 100
817 ms81124 KiB
#include <unordered_map> #include <algorithm> #include <iostream> #include <numeric> #include <cassert> #include <vector> typedef long long llong; const int MAXN = 100 + 10; const int MAXL = 1000 + 10; const int MOD = 1e9 + 7; int n, l; int a[MAXN]; int prefix[MAXN]; std::unordered_map <int,int> dp[MAXN][MAXN][2][2]; int f(int idx, int count, int sum, bool foundB, bool foundE) { if (idx + count - 2 > n || sum + 2 * (prefix[idx + count - 2] - prefix[idx - 1]) > l) { return 0; } if (idx == n + 1) { assert(count == 1 && sum <= l); return foundB && foundE; } if (dp[idx][count][foundB][foundE].count(sum)) { return dp[idx][count][foundB][foundE][sum]; } llong res = f(idx + 1, count + 1, sum - 2 * a[idx], foundB, foundE); if (!foundB) { res += f(idx + 1, count + 1, sum - a[idx], 1, foundE); } if (!foundE) { res += f(idx + 1, count + 1, sum - a[idx], foundB, 1); } if (count >= 1) { res += (2LL * count - foundB - foundE) * f(idx + 1, count, sum, foundB, foundE); if (!foundB) { res += 1LL * (count - foundE) * f(idx + 1, count, sum + a[idx], 1, foundE); if (foundE && count == 1 && idx == n) { res += f(idx + 1, count, sum + a[idx], 1, foundE); } } if (!foundE) { res += 1LL * (count - foundB) * f(idx + 1, count, sum + a[idx], foundB, 1); if (foundB && count == 1 && idx == n) { res += f(idx + 1, count, sum + a[idx], foundB, 1); } } } if (count >= 2) { int cntFree = count - foundB - foundE; res += 1LL * cntFree * (cntFree - 1) * f(idx + 1, count - 1, sum + 2 * a[idx], foundB, foundE); if (foundB) { res += 1LL * (count - 1 - foundE) * f(idx + 1, count - 1, sum + 2 * a[idx], foundB, foundE); } if (foundE) { res += 1LL * (count - 1 - foundB) * f(idx + 1, count - 1, sum + 2 * a[idx], foundB, foundE); } if (foundB && foundE && idx == n) { res += f(idx + 1, count - 1, sum + 2 * a[idx], foundB, foundE); } } return dp[idx][count][foundB][foundE][sum] = res % MOD; } void solve() { if (n == 1) { std::cout << 1 << '\n'; return; } std::sort(a + 1, a + 1 + n); for (int i = 1 ; i <= n ; ++i) { prefix[i] = prefix[i - 1] + a[i]; } std::cout << f(1, 0, 0, 0, 0) << '\n'; } void input() { std::cin >> n >> l; for (int i = 1 ; i <= n ; ++i) { std::cin >> a[i]; } } void fastIOI() { std::ios_base:: sync_with_stdio(0); std::cout.tie(nullptr); std::cin.tie(nullptr); } int main() { fastIOI(); input(); solve(); return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...