Submission #1149882

#TimeUsernameProblemLanguageResultExecution timeMemory
1149882windowwifeSkyscraper (JOI16_skyscraper)C++20
100 / 100
45 ms23940 KiB
#include <bits/stdc++.h>
#define ll long long
#define task ""
using namespace std;
const int maxn = 102, maxa = 1002, mod = 1e9 + 7, inf = 1e9;
ll n, L, d, a[maxn], dp[maxn][maxn][maxa][3], res = 0;
void add (ll &a, ll b)
{
    a += b;
    if (a >= mod) a -= mod;
}
int main()
{
    //freopen(task".INP", "r", stdin);
    //freopen(task".OUT", "w", stdout);
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cin >> n >> L;
    for (int i = 1; i <= n; i++) cin >> a[i];
    if (n == 1)
    {
        cout << 1;
        return 0;
    }
    a[n + 1] = inf;
    sort(a + 1, a + n + 1);
    //idea : initially fill the empty spaces with a[1] and raise it as we go
    if (a[2] - a[1] <= L) dp[1][1][a[2] - a[1]][1] = 2; //pos 1 or n
    if (2*(a[2] - a[1]) <= L) dp[1][1][2*(a[2] - a[1])][0] = 1; //pos 2 -> n - 1
    for (int i = 2; i <= n; i++)
    {
        d = a[i + 1] - a[i];
        for (int j = 1; j < i; j++)
        {
            for (int k = 0; k <= L; k++)
            {
                for (int l = 0; l < 3; l++)
                {
                    ll v = dp[i - 1][j][k][l];
                    if (v == 0) continue;
                    if (l < 2)
                    {
                        if (k + d*(2*j - l + 1) <= L)
                        {
                            add(dp[i][j + 1][k + d*(2*j - l + 1)][l + 1], v*(2 - l)%mod);
                        } //new connected component
                        if (k + d*(2*j - l - 1) <= L)
                        {
                            if (i == n)
                            {
                                add(dp[i][j][k + d*(2*j - l - 1)][l + 1], v*(2 - l)*j%mod);
                            }
                            else if (l == 0 || j > 1)
                            {
                                add(dp[i][j][k + d*(2*j - l - 1)][l + 1], v*(2 - l)*(j - l)%mod);
                            }
                        } //connect to old components
                    } // pos 1 or n
                    if (k + d*(2*j - l + 2) <= L)
                    {
                        add(dp[i][j + 1][k + d*(2*j - l + 2)][l], v);
                    } //new connected component
                    if (k + d*(2*j - l) <= L)
                    {
                        add(dp[i][j][k + d*(2*j - l)][l], v*(2*j - l)%mod);
                    } //connect to old components
                    if (k + d*(2*j - l - 2) <= L && j > 1 && (i == n || j > 2 || l < 2))
                    {
                        if (l == 0)
                        {
                            add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*j*(j - 1)%mod);
                        }
                        if (l == 1)
                        {
                            add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*(j - 1)*(j - 1)%mod);
                        }
                        if (l == 2)
                        {
                            if (i == n)
                            {
                                add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v);
                            }
                            else
                            {
                                add(dp[i][j - 1][k + d*(2*j - l - 2)][l], v*(j - 2)*(j - 1)%mod);
                            }
                        }
                    } //merge 2 components
                    //pos 2 -> n - 1
                }
            }
        }
    }
    for (int i = 0; i <= L; i++) add(res, dp[n][1][i][2]);
    cout << res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...