Submission #1147569

#TimeUsernameProblemLanguageResultExecution timeMemory
1147569raspySkyscraper (JOI16_skyscraper)C++20
15 / 100
1 ms840 KiB
#include <bits/stdc++.h>

#define int long long
#define vi vector<int>
#define ii pair<int, int>
#define f first
#define s second
#define all(x) (x).begin(), (x).end()
#define P 31
#define mod 1'000'000'007
#define inf 1'000'000'000'000
#define pb push_back
#define str string
#define sz(x) (x).size()
#define vvi vector<vi>
#define fun function
#define oopt cin.tie(0);cout.tie(0);ios_base::sync_with_stdio(false);
#define file freopen("problemname.in", "r", stdin); freopen("pr.out", "w", stdout);
#define dbg(v) cout << "Line(" << __LINE__ << ") -> " << #v << " = " << (v) << endl;

using namespace std;
template <class T, int SZ> using arr = array<T, SZ>;

int a[101];
int dp[101][101][1001][3];

void solve()
{
	int n, l;
	cin >> n >> l;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	sort(a+1, a+n+1);
	a[n+1] = 10000;
	dp[0][0][0][0] = 1;
	for (int i = 1; i <= n; i++)
		for (int j = 1; j <= i; j++)
			for (int cl = 0; cl <= l; cl++)
				for (int m = 0; m <= 2; m++)
				{
					int dvig_cn = (2*j-m)*(a[i+1]-a[i]);
					if (dvig_cn > cl) continue;
					int pr_cn = cl-dvig_cn;
					dp[i][j][cl][m] += dp[i-1][j-1][pr_cn][m]; // dodaj zasebe
					dp[i][j][cl][m] += (2*j-m)*dp[i-1][j][pr_cn][m]; // dodaj k ze obstojecemu, samo ne
						// pred zacetek / konec
					if (m) // dodaj na zacetek/konec
						dp[i][j][cl][m] += (m==2?1:2)*dp[i-1][j-1][pr_cn][m-1];
					// dodamo k obstojecemu, tak da vsebuje zac/kon
					if (m==1)
						dp[i][j][cl][m] += 2*j*dp[i-1][j][pr_cn][m-1];
					if (m==2)
					{
						dp[i][j][cl][m] += (j-1)*dp[i-1][j][pr_cn][m-1];
						if (i==n)
							dp[i][j][cl][m] += dp[i-1][j][pr_cn][m-1];
					}
					// zdruzimo dve obstojeci
					if (m == 0)
						dp[i][j][cl][m] += (j)*(j+1)*dp[i-1][j+1][pr_cn][m];
					else if (m==1)
						dp[i][j][cl][m] += j*j*dp[i-1][j+1][pr_cn][m];
					else if (m==2)
					{
						if (i == n)
							dp[i][j][cl][m] += dp[i-1][j+1][pr_cn][m];
						dp[i][j][cl][m] += j*(j-1)*dp[i-1][j+1][pr_cn][m];
					}
					dp[i][j][cl][m] %= mod;
				}
	int rez = 0;
	for (int cl = 0; cl <= l; cl++)
		rez += dp[n][1][cl][2];
	cout << rez%mod << "\n";
}

signed main()
{
	oopt;
	int t = 1;
	// cin >> t;
	while (t--)
		solve();
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...