Submission #230102

#TimeUsernameProblemLanguageResultExecution timeMemory
230102lycBoat (APIO16_boat)C++14
9 / 100
1549 ms7676 KiB
#include <bits/stdc++.h>
using namespace std;

#define TRACE(x) cerr << #x << " :: " << x << endl
#define _ << " " <<
#define SZ(x) (int)(x).size()
#define ALL(x) (x).begin(),(x).end()
#define FOR(i,a,b) for(int i=(a);i<=(b);++i)
#define RFOR(i,a,b) for (int i=(a);i>=(b);--i)

const int MX_N = 505;
const int MOD = 1e9+7;

int N, A[MX_N], B[MX_N];
vector<int> val;

int dp[MX_N][2*MX_N];
int pre[MX_N][2*MX_N];

int inv[MX_N];
map<int,vector<int>> nck;
map<int,vector<int>> prod;

void precomp(int n) {
    if (nck.count(n)) return;
    auto& v = nck[n];
    v.assign(N+1,1);
    FOR(k,1,N) v[k] = 1LL * v[k-1] * (n-k+1) % MOD * inv[k] % MOD;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N;
    FOR(i,1,N){
        cin >> A[i] >> B[i];
        B[i] += 1;
        val.push_back(A[i]);
        val.push_back(B[i]);
    }
    sort(ALL(val));
    val.resize(unique(ALL(val))-val.begin());
    FOR(i,1,N){
        A[i] = lower_bound(ALL(val),A[i])-val.begin();
        B[i] = lower_bound(ALL(val),B[i])-val.begin();
    }

    inv[1] = 1;
    FOR(i,2,N) inv[i] = (MOD - 1LL * (MOD/i) * inv[MOD%i] % MOD) % MOD;
    FOR(i,0,N) precomp(i);
    FOR(i,1,SZ(val)-1) precomp(val[i]-val[i-1]);
    FOR(i,1,SZ(val)-1){
        precomp(val[i]-val[i-1]);
        auto& u = nck[val[i]-val[i-1]];
        auto& v = prod[val[i]-val[i-1]];
        v.assign(N+1,0);
        FOR(x,0,N-2){
            auto& w = nck[x];
            FOR(k,0,x){
                v[x] += 1LL * u[k+2] * w[k] % MOD;
                v[x] %= MOD;
            }
        }
    }

        RFOR(x,SZ(val)-1,0){
            dp[N+1][x] = 1;
            pre[N+1][x] = dp[N+1][x];
        }
    RFOR(i,N,1){
        RFOR(x,SZ(val)-1,0){
            dp[i][x] = 0;
            if (x+1 < SZ(val)) dp[i][x] = (dp[i][x] + dp[i][x+1]) % MOD;
            if (A[i] <= x && x < B[i]) {
                FOR(j,i,N){
                    if (A[i] > x || B[i] <= x) break;
                    int coeff = 0;
                    if (i == j) {
                        coeff = val[x+1]-val[x];
                    } else {
                        coeff = prod[val[x+1]-val[x]][j-i-1];
                    }
                    int sum = (pre[j+1][x+1] - pre[N+2][x+1] + MOD) % MOD;
                    dp[i][x] = (dp[i][x] + 1LL * coeff * sum % MOD) % MOD;
                }
            }
            pre[i][x] = (pre[i+1][x] + dp[i][x]) % MOD;
            //TRACE(i _ x _ dp[i][x]);
        }
    }

    int ans = 0;
    FOR(i,1,N){
        ans = (ans + dp[i][0]) % MOD;
    }
    cout << ans;
}

#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...