Submission #1131557

#TimeUsernameProblemLanguageResultExecution timeMemory
1131557garam1732Boat (APIO16_boat)C++20
0 / 100
11 ms8512 KiB
#include <bits/stdc++.h>
using namespace std;

#define ff first
#define ss second
#define bl ' '
#define endl '\n'
#define all(v) (v).begin(), (v).end()
#define comp(v) (v).erase(unique(all(v)), (v).end())
#define lbd(v,x) lower_bound(all(v), (x))-(v).begin()
#define ubd(v,x) upper_bound(all(v), (x))-(v).begin()

typedef long long ll;
typedef pair<int, int> pi;
typedef pair<pi, int> pii;
typedef pair<int, pi> ipi;
typedef pair<pi, pi> pipi;
typedef pair<ll, ll> pll;

const int MAXN = 100100*5;
const ll MOD = 1e9+7;
const ll INF = 2e18;

vector<ll> v;
pll arr[550];
ll dp[550][550], sum[550][550]; // dp[i][j] : choose jth interval for ith school
ll comb[550][550], fac[MAXN], rfac[MAXN];
ll cnt[550][550];

ll pw(ll a, ll b) {
    if(b==0) return 1;
    ll x=pw(a*a%MOD, b>>1);
    if(b&1) x=x*a%MOD;
    return x;
}

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

    int n; cin>>n;
    for(int i=1; i<=n; i++) {
        cin >> arr[i].ff>>arr[i].ss;
        v.push_back(arr[i].ff); v.push_back(arr[i].ss+1);
    }

    v.push_back(-100);
    sort(all(v)); comp(v);

    fac[0] = 1;
    for(int i=1; i<=n; i++) fac[i]=fac[i-1]*i%MOD;
    rfac[n] = pw(fac[n], MOD-2);
    for(int i=n-1; i>=0; i--) rfac[i]=rfac[i+1]*(i+1)%MOD;

    int sz = v.size();
    for(int i=1; i<sz-1; i++) {
        ll l = v[i+1]-v[i], tmp=1;
        for(int j=0; j<=n; j++) {
            comb[i][j] = tmp*rfac[j]%MOD;
            tmp = tmp*(l+j+1)%MOD;
        }
    }

    for(int i=1; i<=n; i++) {
        arr[i].ff = lbd(v, arr[i].ff);
        arr[i].ss = lbd(v, arr[i].ss+1);//cout<<arr[i].ff<<bl<<arr[i].ss<<endl;

        for(int j=0; j<sz-1; j++) cnt[i][j] = cnt[i-1][j];
        for(int j=arr[i].ff; j<arr[i].ss; j++) cnt[i][j]++;
    }

    dp[0][0] = 1;
    for(int j=0; j<sz-1; j++) sum[0][j] = 1;
    for(int i=1; i<=n; i++) {
        for(int j=arr[i].ff; j<arr[i].ss; j++) {
            for(int k=0; k<i; k++) {
                int t = cnt[i][j]-cnt[k][j];
                dp[i][j] += sum[k][j-1]*(comb[j][t]-comb[j][t-1])%MOD;
            }

            dp[i][j] = (dp[i][j]%MOD+MOD)%MOD;
        }

        sum[i][0] = dp[i][0];
        for(int j=1; j<sz-1; j++) sum[i][j] = (sum[i][j-1]+dp[i][j])%MOD;
    }

    // for(int i=1; i<=n; i++) {
    //     for(int j=0; j<sz-1; j++) cout<<dp[i][j]<<bl;
    //     cout<<endl;
    // }

    ll res=0;
    for(int i=1;i<=n;i++) res += sum[i][sz-2];
    cout<<res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...