#include <iostream>
#include <algorithm>
#include <cstring>
#include <time.h>
#include <set>
using namespace std;
const int maxN = 110, maxS = 1010, oo = 23041997, modP = 1e9 + 7;
int f[maxN][maxN][maxS][3], n, a[maxN], l;
int dp(int i, int cc, int s, int e) {
if (s > l) return 0;
if (i > n) return cc == 1 && e == 2;
if (f[i][cc][s][e] != -1) return f[i][cc][s][e];
int tmp = 0;
int cost = s + (2 * cc - e) * (a[i] - a[i - 1]);
// ** Add new component **
// 1. Endpoints:
if (e < 2) {
tmp = (1ll * tmp + 1ll * dp(i + 1, cc + 1, cost, e + 1) * (2 - e)) % modP;
// Merge new one with sth else immediately:
if (i == n && cc == 1 && e == 1)
tmp = (1ll * tmp + 1ll * dp(i + 1, cc, cost, e + 1)) % modP;
else if (cc - e)
tmp = (1ll * tmp + 1ll * dp(i + 1, cc, cost, e + 1) * (2 - e) * (cc - e)) % modP;
}
// 2. Middle:
tmp = (tmp + dp(i + 1, cc + 1, cost, e)) % modP;
// ** Add to existing component **
// 1. Endpoints:
if (e) tmp = (tmp + dp(i + 1, cc, cost, e) * e) % modP;
// 2. Middle:
//if (i == 3 && cc == 2 && s == 1 && e == 1) cout << "OK " << tmp << endl;
if (cc - e) tmp = (1ll * tmp + 1ll * dp(i + 1, cc, cost, e) * (2 * (cc - e))) % modP;
//if (i == 3 && cc == 2 && s == 1 && e == 1) cout << "OK " << tmp << endl;
// ** Merge existing components **
// 1. Endpoint with middle:
if (e && cc - e)
tmp = (1ll * tmp + 1ll * dp(i + 1, cc - 1, cost, e) * e * (cc - e)) % modP;
// 2. Middle with middle:
if (cc - e >= 2)
tmp = (1ll * tmp + 1ll * dp(i + 1, cc - 1, cost, e) * (cc - e) * (cc - e - 1)) % modP;
// 3. Endpoint with endpoint:
if (e == 2 && cc == 2 && i == n)
tmp = (1ll * tmp + 1ll * dp(i + 1, cc - 1, cost, e)) % modP;
//cout << i << " " << cc << " " << s << " " << e << endl;
//cout << tmp << endl;
return f[i][cc][s][e] = tmp;
}
int main() {
cin >> n >> l;
/*srand(time(NULL));
n = rand() % 10 + 1;
l = rand() % 500 + 1;*/
//cout << n << " " << l << endl;
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
/*set < int > mset;
for (int i = 1; i <= n; ++i) {
a[i] = rand() % 100 + 1;
while (mset.count(a[i])) a[i] = rand() % 100 + 1;
mset.insert(a[i]);
printf("%d ", a[i]);
}
cout << endl;*/
if (n == 1) { cout << 1; return 0; }
sort(a + 1, a + n + 1);
memset(f, 255, sizeof(f));
cout << dp(1, 0, 0, 0);
}
Compilation message
skyscraper.cpp: In function 'int main()':
skyscraper.cpp:59:39: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]);
~~~~~^~~~~~~~~~~~~
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
97 ms |
143864 KB |
Output is correct |
3 |
Correct |
95 ms |
143736 KB |
Output is correct |
4 |
Correct |
95 ms |
143736 KB |
Output is correct |
5 |
Correct |
95 ms |
143864 KB |
Output is correct |
6 |
Correct |
94 ms |
143736 KB |
Output is correct |
7 |
Correct |
95 ms |
143736 KB |
Output is correct |
8 |
Correct |
96 ms |
143812 KB |
Output is correct |
9 |
Correct |
98 ms |
143736 KB |
Output is correct |
10 |
Correct |
96 ms |
143864 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
102 ms |
143768 KB |
Output is correct |
2 |
Correct |
101 ms |
143740 KB |
Output is correct |
3 |
Correct |
97 ms |
143864 KB |
Output is correct |
4 |
Correct |
98 ms |
143736 KB |
Output is correct |
5 |
Correct |
106 ms |
143864 KB |
Output is correct |
6 |
Correct |
118 ms |
143840 KB |
Output is correct |
7 |
Correct |
112 ms |
143736 KB |
Output is correct |
8 |
Correct |
109 ms |
143736 KB |
Output is correct |
9 |
Correct |
109 ms |
143736 KB |
Output is correct |
10 |
Correct |
111 ms |
143764 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
2 ms |
376 KB |
Output is correct |
2 |
Correct |
97 ms |
143864 KB |
Output is correct |
3 |
Correct |
95 ms |
143736 KB |
Output is correct |
4 |
Correct |
95 ms |
143736 KB |
Output is correct |
5 |
Correct |
95 ms |
143864 KB |
Output is correct |
6 |
Correct |
94 ms |
143736 KB |
Output is correct |
7 |
Correct |
95 ms |
143736 KB |
Output is correct |
8 |
Correct |
96 ms |
143812 KB |
Output is correct |
9 |
Correct |
98 ms |
143736 KB |
Output is correct |
10 |
Correct |
96 ms |
143864 KB |
Output is correct |
11 |
Correct |
102 ms |
143768 KB |
Output is correct |
12 |
Correct |
101 ms |
143740 KB |
Output is correct |
13 |
Correct |
97 ms |
143864 KB |
Output is correct |
14 |
Correct |
98 ms |
143736 KB |
Output is correct |
15 |
Correct |
106 ms |
143864 KB |
Output is correct |
16 |
Correct |
118 ms |
143840 KB |
Output is correct |
17 |
Correct |
112 ms |
143736 KB |
Output is correct |
18 |
Correct |
109 ms |
143736 KB |
Output is correct |
19 |
Correct |
109 ms |
143736 KB |
Output is correct |
20 |
Correct |
111 ms |
143764 KB |
Output is correct |
21 |
Correct |
118 ms |
143840 KB |
Output is correct |
22 |
Incorrect |
291 ms |
143744 KB |
Output isn't correct |
23 |
Halted |
0 ms |
0 KB |
- |