Submission #1340580

#TimeUsernameProblemLanguageResultExecution timeMemory
1340580blackscreen1Skyscraper (JOI16_skyscraper)C++20
100 / 100
167 ms260624 KiB
#include <bits//stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
typedef tree<long long, null_type, less<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_set;
typedef tree<long long, null_type, less_equal<long long>, rb_tree_tag,
             tree_order_statistics_node_update>
    ordered_multiset;
#define ll long long
#define iloop(m, h) for (auto i = m; i != h; i += (m < h ? 1 : -1))
#define jloop(m, h) for (auto j = m; j != h; j += (m < h ? 1 : -1))
#define kloop(m, h) for (auto k = m; k != h; k += (m < h ? 1 : -1))
#define lloop(m, h) for (auto l = m; l != h; l += (m < h ? 1 : -1))
#define pll pair<ll, ll>
#define INF 1000000000000000
#define MOD1 1000000007
#define MOD2 998244353
#define MOD3 1000000009
ll n, m, a[105], d[105], dp[105][105][1005][3];
int main() {
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> m;
	iloop(0, n) cin >> a[i];
	sort(a, a+n);
	iloop(0, n-1) d[i] = a[i+1] - a[i];
	d[n-1] = 0;
	memset(dp, 0, sizeof(dp));
	dp[0][0][0][0] = 1;
	iloop(0, n) jloop(1, n+1) kloop(0, m+1) {
		if (k >= (2*j)*d[i]) {
			dp[i+1][j][k][0] += dp[i][j+1][k-(2*j)*d[i]][0]*j;
			dp[i+1][j][k][0] += dp[i][j][k-(2*j)*d[i]][0]*2*j;
			dp[i+1][j][k][0] += dp[i][j-1][k-(2*j)*d[i]][0]*j;
		}
		if (k >= (2*j-1)*d[i]) {
			dp[i+1][j][k][1] += dp[i][j+1][k-(2*j-1)*d[i]][1]*j;
			dp[i+1][j][k][1] += dp[i][j][k-(2*j-1)*d[i]][1]*(2*j-1);
			dp[i+1][j][k][1] += dp[i][j-1][k-(2*j-1)*d[i]][1]*(j-1);
			dp[i+1][j][k][1] += dp[i][j][k-(2*j-1)*d[i]][0]*2;
			dp[i+1][j][k][1] += dp[i][j-1][k-(2*j-1)*d[i]][0]*2;
		}
		if (k >= (2*j-2)*d[i]) {
			dp[i+1][j][k][2] += dp[i][j+1][k-(2*j-2)*d[i]][2]*j;
			dp[i+1][j][k][2] += dp[i][j][k-(2*j-2)*d[i]][2]*(2*j-2);
			dp[i+1][j][k][2] += dp[i][j-1][k-(2*j-2)*d[i]][2]*(j-2);
			if (i) {
				dp[i+1][j][k][2] += dp[i][j][k-(2*j-2)*d[i]][1];
				dp[i+1][j][k][2] += dp[i][j-1][k-(2*j-2)*d[i]][1];
			}
			else {
				dp[i+1][j][k][2] += dp[i][j-1][k-(2*j-2)*d[i]][0];
			}
		}
		lloop(0, 3) {
			dp[i+1][j][k][l] %= MOD1;
			//cout << i+1 << " " << j << " " << k << " " << l << ":" << dp[i+1][j][k][l] << "\n";
		}
	}
	ll cs = 0;
	iloop(0, m+1) {cs += dp[n][1][i][2]; cs %= MOD1;}
	cout << cs;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...