Submission #1150130

#TimeUsernameProblemLanguageResultExecution timeMemory
1150130hahahoang132Skyscraper (JOI16_skyscraper)C++20
100 / 100
89 ms7180 KiB
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const ll N = 1e6 + 5;
const ll base = 37;
const ll inf = LLONG_MAX/4;
const ll mod = 1e9 + 7;
#define bit(x,y) ((x >> y) & 1)
ll d[2][105][1005][2][2];
ll a[105];
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    ll i,j;
    ll n,l;
    cin >> n >> l;
    if(n == 1) 
    {
        cout << 1;
        return 0;
    }
    for(i = 1;i <= n;i++) cin >> a[i];
    sort(a + 1,a + 1 + n);
    if(n == 2)
    {
        if(abs(a[2] - a[1]) <= l) cout << 2;
        else cout << 0;
        return 0;
    }
    ll e = 0;
    d[e][1][0][0][0] = 1;
    d[e][1][0][0][1] = 1;
    d[e][1][0][1][0] = 1;
    for(i = 2;i <= n;i++)
    {
        for(ll i1 = 1;i1 <= n;i1++)
        {
            for(ll i2 = 0;i2 <= l;i2++)
            {
                for(ll cd = 0;cd <= 1;cd++)
                {
                    for(ll cc = 0;cc <= 1;cc++)
                    {
                        ll t = d[e][i1][i2][cd][cc];
                        ll ni2 = i2 + (a[i] - a[i - 1]) * (2 * i1 - cd - cc);
                        d[e][i1][i2][cd][cc] = 0;
                        if(t == 0 || ni2 > l) continue;
                        d[1 - e][i1 + 1][ni2][cd][cc] += ((i1 - cd - cc + 1) * t) % mod;
                        d[1 - e][i1 + 1][ni2][cd][cc] %= mod;
                        if(cd == 0)
                        {
                            d[1 - e][i1 + 1][ni2][1][cc] += t;
                            d[1 - e][i1 + 1][ni2][1][cc] %= mod;
                        }
                        if(cc == 0)
                        {
                            d[1 - e][i1 + 1][ni2][cd][1] += t;
                            d[1 - e][i1 + 1][ni2][cd][1] %= mod;
                        }
                        d[1 - e][i1][ni2][cd][cc] += ((i1 * 2 - cd - cc) * t) % mod;
                        d[1 - e][i1][ni2][cd][cc] %= mod;
                        if(cd == 0)
                        {
                            d[1 - e][i1][ni2][1][cc] += t;
                            d[1 - e][i1][ni2][1][cc] %= mod;
                        }
                        if(cc == 0)
                        {
                            d[1 - e][i1][ni2][cd][1] += t;
                            d[1 - e][i1][ni2][cd][1] %= mod;
                        }
                        d[1 - e][i1 - 1][ni2][cd][cc] += ((i1 - 1) * t) % mod;
                        d[1 - e][i1 - 1][ni2][cd][cc] %= mod;
                    }
                }
            }
        }
        e = 1 - e;
    }
    ll ans = 0;
    for(i = 0;i <= l;i++)
    {
        ans += d[e][1][i][1][1];
        ans %= mod;
    }
    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...