제출 #1275560

#제출 시각아이디문제언어결과실행 시간메모리
1275560raadbuetSkyscraper (JOI16_skyscraper)C++20
100 / 100
197 ms130308 KiB
#include <bits/stdc++.h> #include <bits/extc++.h> // gp_hash_table, pbds using namespace __gnu_pbds; #include<numeric> using namespace std; using ll = long long; #define int ll using ld = long double; using vi = vector<int>; #define pb push_back #define all(x) begin(x), end(x) #define sz(x) (int)(x).size() #define fast ios_base::sync_with_stdio(false); cin.tie(NULL); using pll = pair<ll, ll>; using pi = pair<int, int>; #define f first #define s second #define mp make_pair #define deb false #define INF 1e18 #define mod1 1000000007 #define mod2 998244353 #define N 100001 #define logN 22 #define endl "\n" #define hash1 10007 #define hash2 1009 #define rep(i, a, b) for (int i = a; i <= b; ++i) typedef tree<pi, null_type, less<pi>, rb_tree_tag, tree_order_statistics_node_update> ordered_set; int tc = 1, t = 1; long long binpow(long long a, long long b, long long m) { long long res = 1; while (b > 0) { if (b & 1) res = (res * a) % m; a = (a * a) % m; b >>= 1; } return res % m; } void modplus(int &a, int b) { b %= mod1; a = (a + b) % mod1; } int dp[101][101][1001][3]; void solve() { int n, l; cin >> n >> l; vi wow(n); for (int i = 0; i < n; i++) { cin >> wow[i]; } sort(all(wow)); if (n == 1) { cout << 1 << endl; return; } else if (n == 2) { cout << 2 * ((wow[1] - wow[0]) <= l) << endl; return; } dp[0][1][0][0] = 1; dp[0][1][0][1] = 2; for (int i = 0; i + 1 < n; i++) { for (int j = 1; j <= n; j++) { for (int k = 0; k <= l; k++) { // 0 to 0 if (k + 2 * j * (wow[i + 1] - wow[i]) <= l) { modplus(dp[i + 1][j - 1][k + 2 * j * (wow[i + 1] - wow[i])][0], (j - 1) * dp[i][j][k][0]); modplus(dp[i + 1][j + 1][k + 2 * j * (wow[i + 1] - wow[i])][0], (j + 1) * dp[i][j][k][0]); modplus(dp[i + 1][j][k + 2 * j * (wow[i + 1] - wow[i])][0], 2 * j * dp[i][j][k][0]); } //1 to 1 if (k + (2 * j - 1)* (wow[i + 1] - wow[i]) <= l) { modplus(dp[i + 1][j - 1][k + (2 * j - 1)* (wow[i + 1] - wow[i])][1], (j - 1) * dp[i][j][k][1]); modplus(dp[i + 1][j + 1][k + (2 * j - 1)* (wow[i + 1] - wow[i])][1], j * dp[i][j][k][1]); modplus(dp[i + 1][j][k + (2 * j - 1) * (wow[i + 1] - wow[i])][1], (2 * j - 1) * dp[i][j][k][1]); } //2 to 2 if (k + (2 * j - 2) * (wow[i + 1] - wow[i]) <= l) { modplus(dp[i + 1][j - 1][k + (2 * j - 2)* (wow[i + 1] - wow[i])][2], (j - 1) * dp[i][j][k][2]); modplus(dp[i + 1][j + 1][k + (2 * j - 2)* (wow[i + 1] - wow[i])][2], (j - 1) * dp[i][j][k][2]); modplus(dp[i + 1][j][k + (2 * j - 2) * (wow[i + 1] - wow[i])][2], (2 * j - 2) * dp[i][j][k][2]); } //0 to 1 trans if (k + 2 * j * (wow[i + 1] - wow[i]) <= l) { modplus(dp[i + 1][j][k + 2 * j * (wow[i + 1] - wow[i])][1], 2 * dp[i][j][k][0]); modplus(dp[i + 1][j + 1][k + 2 * j * (wow[i + 1] - wow[i])][1], 2 * dp[i][j][k][0]); } //1 to 2 trans if (k + (2 * j - 1) * (wow[i + 1] - wow[i]) <= l) { modplus(dp[i + 1][j][k + (2 * j - 1) * (wow[i + 1] - wow[i])][2], dp[i][j][k][1]); modplus(dp[i + 1][j + 1][k + (2 * j - 1) * (wow[i + 1] - wow[i])][2], dp[i][j][k][1]); } } } } int ans = 0; for (int i = 0; i <= l; i++) { modplus(ans, dp[n -1][1][i][2]); } cout << ans << endl; } int32_t main() { fast; //cin >> t; //preproces(); for (tc = 1; tc <= t; tc++) { solve(); } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...