Submission #1271847

#TimeUsernameProblemLanguageResultExecution timeMemory
1271847ZeroCoolBoat (APIO16_boat)C++20
100 / 100
1126 ms4420 KiB
#include <bits/stdc++.h>
using namespace std;;
#define ll long long
#define ar array
#define ld double
#define int long long
#define all(v) v.begin(), v.end()

//  #pragma GCC optimize("O3,Ofast,unroll-loops ")

const int N = 3010;
const int M = 20;
const int LOG = 20;
const int INF = 1e17;	
int MOD = 1e9 + 7;
const ld EPS = 1e-12;

template<typename T>
inline void chmin(T &x,T y){x = min(x, y);}
template<typename T>
inline void chmax(T &x,T y){x = max(x, y);}
inline void mm(int &x){x = (x % MOD + MOD) % MOD;};

int W(int l1,int r1,int l2,int r2){
    int a = max(l1, l2 + 1);
    int b = min(r1, r2);
    int c = max(r2 + 1, l1);
    int x = r2 - l2 + 1;
    int u = max(0ll, b - a + 1) * (a + b - 2 * l2) / 2;
    int v = max(0ll, r1 -  c + 1) * x;
    mm(u);
    mm(v); 
    return (u + v) % MOD;
}

int inv[N];

int P(int a,int b){
    int ans = 1;
    while(b){
        if(b % 2)mm(ans *= a);
        b /= 2;
        mm(a *= a);
    }
    return ans;
}

void orz(){
    inv[0] = 1;
    for(int i = 1;i < N;i++)inv[i] = P(i, MOD - 2);
    int n;
    cin>>n;
    int L[n + 1], R[n + 1];
    // cout<<P(2, 5)<<'\n';
    for(int i = 1;i <= n;i++)cin>>L[i]>>R[i];
    vector<int> v;
    for(int i = 1;i <= n;i++)v.push_back(L[i]), v.push_back(R[i] + 1);
    sort(all(v));
    v.erase(unique(all(v)), v.end());
    vector<ar<int,2>> S = {{0, 0}};
    for(int i = 0;i + 1 < v.size();i++)S.push_back({v[i], v[i + 1] - 1});
    int m = S.size();
    int dp[n + 1][m];
    memset(dp, 0, sizeof dp);
    for(int i = 0;i < m;i++)dp[0][i] = 1;
    for(int i = 1;i <= n;i++){
        dp[i][0] = 1;
        for(int j = 1;j < m;j++){
            dp[i][j] = dp[i][j - 1];
            auto [l, r] = S[j];
            int cnt = 0, mult = 1;
            for(int k = i;k;k--){
                if(L[k] <= l && r <= R[k]){
                    cnt++;
                    mm(mult *= ((r - l + cnt) * inv[cnt]) % MOD);
                    mm(dp[i][j] += (dp[k - 1][j - 1] * mult) % MOD);
                }
            }
        }
    }
    int ans = dp[n][m - 1];
    mm(ans -= 1);
    cout<<ans;
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    int t = 1;
    //  cin>>t;
    while (t--)orz();
}   
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...