제출 #230108

#제출 시각아이디문제언어결과실행 시간메모리
230108lycBoat (APIO16_boat)C++14
100 / 100
655 ms2480 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 inv[MX_N];
int f[MX_N][2*MX_N];

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] = (long long) (MOD-MOD/i) * inv[MOD%i] % MOD;

    FOR(p,0,SZ(val)-1) f[N+1][p] = 1;
    FOR(i,1,N) f[i][SZ(val)] = 0;
    RFOR(p,SZ(val)-2,0){
        int lp = val[p+1]-val[p];
        RFOR(i,N,1){
            f[i][p] = 0;
            if (p < SZ(val)-1) f[i][p] = (f[i][p] + f[i][p+1]) % MOD;
            if (A[i] <= p && p < B[i]) {
                int m = 0;
                int g = lp;
                FOR(j,i+1,N+1){
                    f[i][p] = (f[i][p] + (long long) g * f[j][p+1] % MOD) % MOD;
                    if (A[j] <= p && p < B[j]) {
                        ++m;
                        g = (long long) g * (m + lp) % MOD * inv[m+1] % MOD;
                    }
                }
            }
            //TRACE(i _ p _ f[i][p]);
        }
    }
    int ans = 0;
    FOR(i,1,N) ans = (ans + f[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...