제출 #614194

#제출 시각아이디문제언어결과실행 시간메모리
614194dutinmeowSkyscraper (JOI16_skyscraper)C++17
100 / 100
149 ms242540 KiB
#include <bits/stdc++.h>
using namespace std;

const int INF = 1e9, MOD = 1e9 + 7;

int main() {
	int N, L;
	cin >> N >> L;
	vector<int> A(N + 1);
	for (int i = 1; i <= N; i++)
		cin >> A[i];
	sort(A.begin() + 1, A.end());
	A.push_back(INF);
	if (N == 1) {
		cout << 1 << '\n';
		return 0;
	} 
	
	vector<vector<vector<array<long long, 3>>>> dp(N + 1, vector<vector<array<long long, 3>>>(N + 1, vector<array<long long, 3>>(L + 1)));
	dp[0][0][0][0] = 1;
	for (int i = 1; i <= N; i++) {
		for (int j = 1; j <= i; j++) {
			for (int k = 0; k <= L; k++) {
				for (int m = 0; m <= 2; m++) {
					int d = (2 * j - m) * (A[i + 1] - A[i]);
					if (d > k || i + j + 1 - m > N)
						continue;
					long long &f = dp[i][j][k][m];
					f = 0;
					f += dp[i - 1][j - 1][k - d][m];
					f += m == 0 ? 0 : (3 - m) * dp[i - 1][j - 1][k - d][m - 1];
					f += (2 * j - m) * dp[i - 1][j][k - d][m];
					f += m == 0 ? 0 : (m == 1 ? 2 * j * dp[i - 1][j][k - d][m - 1] : (i == N ? dp[i - 1][j][k - d][m - 1] : (j - 1) * dp[i - 1][j][k - d][m - 1]));
					f += m == 0 ? j * (j + 1) * dp[i - 1][j + 1][k - d][m] : (m == 1 ? j * j * dp[i - 1][j + 1][k - d][m] : (i == N ? dp[i - 1][j + 1][k - d][m] : j * (j - 1) * dp[i - 1][j + 1][k - d][m]));
					f %= MOD;
				}
			}
		}
	}

	long long ans = 0;
	for (int k = 0; k <= L; k++)
		ans += dp[N][1][k][2];
	cout << ans % MOD << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...