Submission #40412

#TimeUsernameProblemLanguageResultExecution timeMemory
40412RockyBSkyscraper (JOI16_skyscraper)C++14
100 / 100
407 ms181356 KiB
/// In The Name Of God #pragma GCC optimize("Ofast") #pragma GCC target("sse,sse2,sse3,sse3,sse4,popcnt,abm,mmx") #include <bits/stdc++.h> #define f first #define s second #define pb push_back #define pp pop_back #define mp make_pair #define sz(x) (int)x.size() #define sqr(x) ((x) * 1ll * (x)) #define all(x) x.begin(), x.end() #define Kazakhstan ios_base :: sync_with_stdio(0), cin.tie(0), cout.tie(0); #define nl '\n' #define ioi exit(0); typedef long long ll; typedef long double ld; typedef unsigned long long ull; const int N = (int)100 + 7; const int L = (int)1e3 + 7; const int inf = (int)1e9 + 7; const int mod = (int)1e9 + 7; const ll linf = (ll)1e18 + 7; const int dx[] = {-1, 0, 1, 0, 1, -1, -1, 1}; const int dy[] = {0, 1, 0, -1, 1, -1, 1, -1}; using namespace std; int n, S; int a[N]; int dp[2][2][N][N][L]; int calc(int at = 1, int curl = 0, int cnt = 0, int l = 0, int r = 0) { if (cnt < 0) return 0; /// add previous cost if (at > 1) { curl += (l + r + 2 * cnt) * (a[at] - a[at - 1]); } if (curl > S) return 0; if (at == n) { return cnt == 0 ? 1 : 0; } if (~dp[l][r][at][cnt][curl]) return dp[l][r][at][cnt][curl]; ll res = 0; ///new component res += calc(at + 1, curl, cnt + 1, l, r); res %= mod; ///add to left border res += calc(at + 1, curl, cnt, 1, r); res %= mod; ///connect left border and some middle component res += calc(at + 1, curl, cnt - 1, 1, r) * (ll)cnt; res %= mod; ///add to right border res += calc(at + 1, curl, cnt, l, 1); res %= mod; ///connect right border and some middle component res += calc(at + 1, curl, cnt - 1, l, 1) * (ll)cnt; res %= mod; ///connect with middle component res += calc(at + 1, curl, cnt, l, r) * (ll)cnt * 2; res %= mod; ///connect two middle component res += calc(at + 1, curl, cnt - 1, l, r) * (ll)cnt * (cnt - 1); res %= mod; return dp[l][r][at][cnt][curl] = res; } int main() { #ifdef IOI2018 freopen ("in.txt", "r", stdin); #endif Kazakhstan cin >> n >> S; for (int i = 1; i <= n; i++) { cin >> a[i]; } sort (a + 1, a + 1 + n); memset(dp, -1, sizeof(dp)); cout << calc(); ioi }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...