Submission #1271843

#TimeUsernameProblemLanguageResultExecution timeMemory
1271843VMaksimoski008Boat (APIO16_boat)C++17
100 / 100
211 ms17816 KiB
#include <bits/stdc++.h>
#define ar array
//#define int long long

using namespace std;

using ll = long long;
using pii = pair<int, int>;
using pll = pair<ll, ll>;

const int mod = 1e9 + 7;
const ll inf = 1e18;
const int N = 1e5 + 5;

ll add(ll a, ll b) {
    return a + b - (a + b >= mod ? mod : 0);
}

ll mul(ll a, ll b) {
    return a * b % mod;
}

ll exp(ll a, ll b) {
    ll ans = 1;
    while(b) {
        if(b & 1) ans = ans * a % mod;
        a = a * a % mod;
        b /= 2;
    }
    return ans;
}

ll fac[N], inv[N];

ll dp[1005][1005], dp_ways[1005][1005];
vector<int> cmp;
int n, L[N], R[N], m;

signed main() {
    fac[0] = inv[0] = 1;
    for(int i=1; i<N; i++) {
        fac[i] = fac[i-1] * i % mod;
        inv[i] = exp(fac[i], mod - 2);
    }
    
    cin >> n;
    set<int> st = { 0 };

    for(int i=1; i<=n; i++) {
        cin >> L[i] >> R[i];
        st.insert(L[i]);
        st.insert(++R[i]);
    }

    cmp = vector<int>( st.begin(), st.end() );
    for(int i=1; i<=n; i++) {
        L[i] = lower_bound(cmp.begin(), cmp.end(), L[i]) - cmp.begin();
        R[i] = lower_bound(cmp.begin(), cmp.end(), R[i]) - cmp.begin() - 1;
    }

    m = cmp.size() - 1;
    memset(dp, 0, sizeof(dp));

    //aaaaaaaaaaaaaaah
    for(int j=0; j<m; j++) {
        ll x = 1;
        for(int i=1; i<=n; i++) {
            x = mul(x, cmp[j+1]-cmp[j]+i-1);
            dp_ways[j][i] = mul(x, inv[i]);
        }
    }

    dp[0][0] = 1;
    for(int i=1; i<=n; i++) {
        for(int j=1; j<=m; j++)
            dp[i-1][j] = add(dp[i-1][j-1], dp[i-1][j]);

        for(int j=L[i]; j<=R[i]; j++) {
            int cnt = 0;

            for(int k=i; k>=1; k--) {
                if(L[k] <= j && j <= R[k]) cnt++;
                dp[i][j] = add(dp[i][j], mul(dp[k-1][j-1], dp_ways[j][cnt]));
            }
        }
    }

    ll ans = 0;
    for(int j=1; j<=m; j++)
        dp[n][j] = add(dp[n][j], dp[n][j-1]);
    for(int i=1; i<=n; i++)
        ans = add(ans, dp[i][m]);
    cout << ans << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...