Submission #446754

#TimeUsernameProblemLanguageResultExecution timeMemory
446754arminatarodSkyscraper (JOI16_skyscraper)C++17
100 / 100
107 ms50968 KiB
#include <bits/stdc++.h>

using namespace std;

constexpr int MAXN = 105;

constexpr int MAXL = 1005;

constexpr int MAXINT = 1073741823;

constexpr int MOD = 1000000007;

int a[MAXN];

long long int dp[MAXN][MAXN][MAXL][3];

int main() {
	ios::sync_with_stdio(false);
	cin.tie(0);
	long long int n, l, new_sum, answer = 0;
	cin >> n >> l;
	if (n == 1) {
		cout << 1;
		return 0;
	}
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	sort(a + 1, a + n + 1);
	a[n + 1] = MAXINT;
	dp[0][0][0][0] = 1;
	for (int i = 1; i <= n; i++)
		for (int components = 1; components <= i; components++)
			for (int sum = 0; sum <= l; sum++)
				for (int endpoints = 0; endpoints <= 2; endpoints++) {
					new_sum = (2 * components - endpoints) * (a[i + 1] - a[i]);
					if (new_sum > sum || i + components + 1 - endpoints > n)
						continue;
					new_sum = sum - new_sum;
					dp[i][components][sum][endpoints] += dp[i - 1][components - 1][new_sum][endpoints];
					if (endpoints > 0)
						dp[i][components][sum][endpoints] += (3 - endpoints) * dp[i - 1][components - 1][new_sum][endpoints - 1];
					dp[i][components][sum][endpoints] += (2 * components - endpoints) * dp[i - 1][components][new_sum][endpoints];
					if (endpoints == 1)
						dp[i][components][sum][endpoints] += 2 * components * dp[i - 1][components][new_sum][0];
					else if (endpoints == 2 && i == n)
						dp[i][components][sum][endpoints] += dp[i - 1][components][new_sum][1];
					else if (endpoints == 2 && components > 1)
						dp[i][components][sum][endpoints] += (components - 1) * dp[i - 1][components][new_sum][1];
					if (endpoints == 2 && i == n)
						dp[i][components][sum][endpoints] += dp[i - 1][components + 1][new_sum][2];
					else if (endpoints == 2)
						dp[i][components][sum][endpoints] += components * (components - 1) * dp[i - 1][components + 1][new_sum][2];
					else if (endpoints == 1)
						dp[i][components][sum][endpoints] += components * components * dp[i - 1][components + 1][new_sum][1];
					else
						dp[i][components][sum][endpoints] += components * (components + 1) * dp[i - 1][components + 1][new_sum][0];
					dp[i][components][sum][endpoints] %= MOD;
				}
	for (int i = 0; i <= l; i++)
		answer = (answer + dp[n][1][i][2]) % MOD;
	cout << answer;
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...