제출 #316508

#제출 시각아이디문제언어결과실행 시간메모리
316508nouvo25Skyscraper (JOI16_skyscraper)C++14
100 / 100
64 ms17912 KiB
#include <bits/stdc++.h> #define fi first #define se second #define ll long long #define io ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0) using namespace std; const int MOD = 1e9 + 7, MAXN = 107; int dp[MAXN][MAXN][1007][4] = {}, n, l, a[MAXN]; void add(int &a, const int &b) { a += b; if (a >= MOD) a -= MOD; } int main() { // freopen("test.INP","r", stdin); // freopen("BAILAM.OUT","w",stdout); io; cin >> n >> l; for (int i = 1; i <= n; ++i) cin >> a[i]; sort(a + 1, a + 1 + n); if (n == 1) { cout << 1; return 0; } a[n + 1] = 10000; if (a[2] - a[1] <= l) dp[2][1][a[2] - a[1]][1] = 2;//dat o a[1] o mot dau if (n > 2 && 2*(a[2] - a[1]) <= l) dp[2][1][2*(a[2] - a[1])][0] = 1;//dat a[1] o giua for (int i = 2; i <= n; ++i) for (int j = 1; j <= i; ++j) for (int k = 0; k <= l; ++k) for (int z = 0; z < 3; ++z) if (dp[i][j][k][z]) { int diff = a[i + 1] - a[i], cur = dp[i][j][k][z]; int nwk = k + (2*j - z - 1)*diff; //dat endpoint if (z < 2) { //noi vao mot tplt if (nwk <= l) { if (i == n) { //diem cuoi co the noi 2 endpoints add(dp[i + 1][j][nwk][z + 1], 1LL*cur*(2 - z)*j % MOD); }else { //khong noi duoc 2 endpoints add(dp[i + 1][j][nwk][z + 1], 1LL*cur*(2 - z)*(j - z) % MOD); } } //tao tplt moi nwk = k + (2*j - z + 1)*diff; if (nwk <= l) add(dp[i + 1][j + 1][nwk][z + 1], (2 - z)*cur % MOD); } //khong dat endpoint //tao tplt moi nwk = k + (2*j - z + 2)*diff; if (nwk <= l) add(dp[i + 1][j + 1][nwk][z], cur); //noi vao 1 tplt nwk = k + (2*j - z)*diff; if (nwk <= l) add(dp[i + 1][j][nwk][z], 1LL*(2*j - z)*cur % MOD); //noi 2 tplt nwk = k + (2*j - z - 2)*diff; if (nwk <= l && j > 1 && ((i == n) || (z < 2) || (j > 2))) { if (z == 0) { add(dp[i + 1][j - 1][nwk][z], 1LL*j*(j - 1)*cur % MOD); } if (z == 1) { // if (i == 3 && j == 1 && k == 2 && z == 1) cout << 2*j - z - 2 << '\n'; add(dp[i + 1][j - 1][nwk][z], 1LL*(j - 1)*(j - 1)*cur % MOD); } if (z == 2) { if (i == n) { add(dp[i + 1][j - 1][nwk][z], cur); }else { add(dp[i + 1][j - 1][nwk][z], 1LL*(j - 2)*(j - 1)*cur % MOD); } } } } int res = 0; for (int i = 0; i <= l; ++i) add(res, dp[n + 1][1][i][2]); cout << res; return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...