Submission #1357057

#TimeUsernameProblemLanguageResultExecution timeMemory
1357057AzeTurk810Boat (APIO16_boat)C++20
100 / 100
600 ms2536 KiB
/*
Telebe of Adicto && Mamedov yani AzeTurk810
I see humans but no humanity
*/
#include <algorithm>
#include <array>
#include <iostream>
#include <map>
#include <regex>
#include <unordered_map>
#include <utility>
#include <vector>

// mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

using ll = long long;
using namespace std;

#define ln '\n'
#define INFi 1e9
#define INFll 1e18
#define map unordered_map

#ifdef ONPC
#include <algo.hpp>
#else
#define dbg(...)
#define dbg_out(...)
#endif

constexpr ll MOD = 1e9 + 7, N = 505, M = N * 4;

int _n, _m;
ll dp[N], pref[N], dp2[N][N], L[N], R[N], fact[N], invfact[N], ff[N];
ll ans;

long long bp(long long a, long long b) {
    long long res = 1;
    while (b > 0) {
        if (b & 1LL)
            res = (res * a) % MOD;
        a = (a * a) % MOD;
        b >>= 1;
    }
    return res;
}

inline ll inv(ll v) {
    dbg(v);
    if (ff[v] == 0)
        ff[v] = bp(v, MOD - 2);
    return ff[v];
}

inline ll add(ll l, ll r) {
    l += r;
    while (l >= MOD) {
        l -= MOD;
    }
    return l;
}

inline ll mult(ll l, ll r) {
    return (l * r) % MOD;
}

inline ll del(ll r, ll l) {
    return (r - l + MOD) % MOD;
}

inline void init_comb() {
    fact[0] = 1;
    for (int i = 1; i < N; i++) {
        fact[i] = mult(fact[i - 1], i);
    }
    invfact[N - 1] = inv(fact[N - 1]);
    for (int i = N - 2; i >= 0; --i) {
        invfact[i] = mult(invfact[i + 1], i + 1);
    }
}

inline ll C(ll n, ll k) {
    if (k < 0 || k > _n)
        return 0;
    dbg(make_pair(n, k));
    dbg(invfact[k]);
    dbg(invfact[n - k]);
    dbg(fact[n]);
    return mult(fact[n], mult(invfact[k], invfact[n - k]));
}

vector<ll> compsf;
map<ll, ll> compr, rev;

int compress() {
    sort(compsf.begin(), compsf.end());
    compsf.erase(unique(compsf.begin(), compsf.end()), compsf.end());
    ll nxt = 0;
    for (const ll &v : compsf) {
        rev[nxt] = v;
        compr[v] = nxt++;
    }
    return compsf.size();
}

inline void systemd() {
    // init_comb(); WARNING:
}

char solve() {
    if (!(cin >> _n))
        return 1;
    systemd();
    for (size_t i = 1; i <= _n; i++) {
        cin >> L[i] >> R[i];
        R[i]++;
        compsf.push_back(L[i]);
        compsf.push_back(R[i]);
    }
    _m = compress();
    dp[0] = 1;
    for (int z = 1; z < _m; z++) {
        int st = rev[z - 1], fs = rev[z], sz = fs - st;
        vector<int> can;
        pref[0] = 1;
        for (int i = 1; i <= _n; i++) {
            pref[i] = add(pref[i - 1], dp[i]);
            if (L[i] <= st && fs <= R[i]) {
                can.push_back(i);
            }
        }
        int m = can.size();
        if (m == 0)
            continue;
        int lim = min(m, sz);
        for (int k = 1; k <= lim; ++k)
            for (int j = 0; j < m; ++j)
                dp2[k][j] = 0;
        for (int k = 1; k <= lim; k++) {
            for (int j = k - 1; j < m; j++) {
                if (k == 1) {
                    ll val = mult(pref[can[j] - 1], sz);
                    if (j)
                        val = add(val, dp2[k][j - 1]);
                    dp2[k][j] = val;
                    continue;
                }
                ll val = mult(dp2[k - 1][j - 1], inv(k));
                val = mult(val, sz - k + 1);
                dbg(val);
                if (j)
                    val = add(val, dp2[k][j - 1]);
                dp2[k][j] = val;
            }
        }

        for (int k = 1; k <= lim; k++) {
            for (int j = k - 1; j < m; ++j) {
                ll ex = dp2[k][j];
                if (j)
                    ex = del(ex, dp2[k][j - 1]);
                dp[can[j]] = add(dp[can[j]], ex);
            }
        }
    }
    ans = 0;
    for (size_t i = 1; i <= _n; i++) {
        ans = add(ans, dp[i]);
    }
    cout << ans << ln;
    return 0;
}

// Attack on titan<3

signed main() {
    ios::sync_with_stdio(0);
    cin.tie(nullptr);
    int t = 1e9;
    // cin >> t;
    for (int cases = 0; cases < t; cases++) {
        if (solve())
            break;
#ifdef ONPC
        cerr << "__________\n";
#endif
    }
}
// Just Imaginary
/*
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠀⠀⠀⢀⣴⣾⠀⠀⠀⡀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⣿⣿⣦⣾⣿⣿⣿⣿⣿⡆⠁⠀⢀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣿⣿⣿⣿⣿⣿⣿⣿⡿⠁⠀⡠⠂⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠠⠔⠚⣿⣿⣿⣿⣿⣦⡄⠀⠁⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⢀⠠⠐⢂⠉⡀⣀⣤⣄⢻⣿⣿⡟⢈⡹⣿⡀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⡀⠄⠂⠈⠀⣶⣤⣾⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⠘⣷⡀⠀⡀⠐⠂⠐⢄
⠀⠀⠀⠀⠀⠀⠀⣿⣿⠟⠿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣧⣀⣾⣷⠯⠀⠤⠤⠄⠈
⠀⠀⠀⠀⠀⠀⣼⣿⡟⠀⠀⣹⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⣄⡀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⣰⣿⠋⠀⠀⢠⣾⣿⣿⣿⣿⣿⣭⠟⢻⣿⣿⣿⣿⡿⠁⠀⠀⠀⠀
⠀⠀⠀⣀⣶⡟⠁⠀⢾⣶⣿⠟⠉⠈⢻⣿⣿⣿⣦⣜⠀⠛⠛⠿⠁⠀⠀⠀⠀⠀
⠚⠻⠿⠿⡿⠁⠀⢠⣿⣿⠁⠀⣠⠖⠋⠉⠻⣿⣿⣿⣶⡀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⠀⠀⣰⣿⡿⠃⠠⠊⠁⠀⠀⠀⠀⠈⢿⣿⣿⠟⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⠀⢀⣴⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀
⠀⠀⠀⣠⣾⠏⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
⢀⣴⠾⠟⠛⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀
*/
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...