Submission #1275559

#TimeUsernameProblemLanguageResultExecution timeMemory
1275559raadbuetSkyscraper (JOI16_skyscraper)C++20
100 / 100
455 ms290436 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][3001][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...