Submission #1087787

#TimeUsernameProblemLanguageResultExecution timeMemory
1087787TAhmed33Skyscraper (JOI16_skyscraper)C++98
100 / 100
199 ms122964 KiB
#include <bits/stdc++.h> using namespace std; #pragma GCC optimize ("Ofast") typedef long long ll; const int MOD = 1e9 + 7; int add (int a, int b) { a += b; if (a >= MOD) a -= MOD; return a; } int sub (int a, int b) { a -= b; if (a < 0) a += MOD; return a; } int mul (int a, int b) { return (a * 1ll * b) % MOD; } int power (int a, int b) { if (!b) return 1; int u = power(a, b >> 1); u = mul(u, u); if (b & 1) u = mul(u, a); return u; } int n, l, a[101]; const int B = 1000; int dp[102][102][B + 1][3]; int ans (int x, int y, int z, int c) { if (y < 1 || c < 0 || c > 2 || z < 0 || z > B) { return 0; } if (x == n + 1) { return y == 1 && z >= 0 && z <= l && c == 0; } int &ret = dp[x][y][z][c]; if (ret != -1) { return ret; } ret = 0; if (y == 1) { ret = add(ret, mul(c, ans(x + 1, y, z + c * a[x], c))); //add to end, and leave open ret = add(ret, mul(c, ans(x + 1, y, z + c * a[x], c - 1))); //add to end, and close ret = add(ret, mul(c, ans(x + 1, y + 1, z + c * a[x], c))); //add new open component ret = add(ret, mul(c, ans(x + 1, y + 1, z + c * a[x], c - 1))); //add new closed component } else { int u = 2 * y - 2 + c; ret = add(ret, mul(c, ans(x + 1, y + 1, z + u * a[x], c))); //add new open component to end ret = add(ret, mul(c, ans(x + 1, y + 1, z + u * a[x], c - 1))); //add new closed component to end ret = add(ret, mul(c, ans(x + 1, y, z + u * a[x], c - 1))); //add to end and close ret = add(ret, mul(y - 1, ans(x + 1, y + 1, z + u * a[x], c))); //insert new component in the middle ret = add(ret, mul(y - 1, ans(x + 1, y - 1, z + u * a[x], c))); //merge two components ret = add(ret, mul(u, ans(x + 1, y, z + u * a[x], c))); //add to end of any component } return ret; } void solve () { memset(dp, -1, sizeof(dp)); cin >> n >> l; for (int i = 1; i <= n; i++) { cin >> a[i]; } if (n == 1) { cout << 1 << '\n'; return; } sort(a + 1, a + n + 1); for (int i = n; i >= 1; i--) { a[i] = a[i] - a[i - 1]; } a[1] = 0; int sum = ans(2, 1, 0, 1); sum = mul(sum, 2); sum = add(sum, ans(2, 1, 0, 2)); cout << sum << '\n'; } signed main () { ios::sync_with_stdio(0); cin.tie(0); int tc = 1; //cin >> tc; while (tc--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...