Submission #1297231

#TimeUsernameProblemLanguageResultExecution timeMemory
1297231danglayloi1Skyscraper (JOI16_skyscraper)C++20
100 / 100
130 ms130544 KiB
#include <bits/stdc++.h>
#define ii pair<int, int>
#define fi first
#define se second
#define inf 0x3f3f3f3f3f3f3f3f
using namespace std;
using ll = long long;
const ll mod=1e9+7;
const int nx=105;
int add(int a, int b)
{
    a+=b;
    if(a>=mod) a-=mod;
    return a;
}
int mul(int a, int b)
{
    ll tmp=1ll*a*b;
    if(tmp>=mod) tmp%=mod;
    return tmp;
}
int n, l, a[nx], dp[nx][nx][1005][3];
int f(int i, int cc, int cur, int ends)
{
    if(cur>l || ends>2) return 0;
    if(i>1 && cc<=0) return 0;
    if(i==n+1) return (cc==1 && ends==2);
    int &res=dp[i][cc][cur][ends];
    if(res!=-1) return res;
    res=0;
    int nxt=cur+(2*cc-ends)*(a[i]-a[i-1]);
    // ends
    // new cc
    res=add(res, mul(cc+1-ends, f(i+1, cc+1, nxt, ends)));
    // merge 2 cc
    res=add(res, mul(cc-1, f(i+1, cc-1, nxt, ends)));
    // extend a cc
    res=add(res, mul(2*cc-ends, f(i+1, cc, nxt, ends)));
    // ends+1
    // new cc
    res=add(res, mul(2-ends, f(i+1, cc+1, nxt, ends+1)));
    // extend a cc
    res=add(res, mul(2-ends, f(i+1, cc, nxt, ends+1)));
    return res;
}
int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin>>n>>l;
    for(int i = 1; i <= n; i++)
        cin>>a[i];
    if(n==1) return cout<<1, 0;
    sort(a+1, a+n+1);
    memset(dp, -1, sizeof(dp));
    cout<<f(1, 0, 0, 0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...