Submission #833041

#TimeUsernameProblemLanguageResultExecution timeMemory
833041errayBoat (APIO16_boat)C++17
100 / 100
707 ms4432 KiB
#include <bits/stdc++.h> using namespace std; #ifdef DEBUG #include "/home/eagle/ioi22/d2/debug.h" #else #define debug(...) void(37) #endif constexpr int md = int(1e9) + 7; int add(int x, int y) { if ((x += y) > md) { x -= md; } return x; } int mul(int x, int y) { return 1LL * x * y % md; } int power(int x, int p) { int res = 1; while (p > 0) { if (p & 1) { res = mul(res, x); } x = mul(x, x); p >>= 1; } return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(0); int N; cin >> N; vector<int> A(N), B(N); for (int i = 0; i < N; ++i) { cin >> A[i] >> B[i]; ++B[i]; } vector<int> inv(N + 1); for (int i = 1; i <= N; ++i) { inv[i] = power(i, md - 2); } debug(inv); vector<int> ranges(2 * N); for (int i = 0; i < N; ++i) { ranges[2 * i] = A[i]; ranges[2 * i + 1] = B[i]; } sort(ranges.begin(), ranges.end()); ranges.erase(unique(ranges.begin(), ranges.end()), ranges.end()); const int S = int(ranges.size()); vector<vector<int>> binom(S - 1, vector<int>(N + 1)); for (int i = 0; i < S - 1; ++i) { int diff = ranges[i + 1] - ranges[i]; binom[i][0] = 1; for (int j = 1; j <= min(N, diff); ++j) { binom[i][j] = mul(mul(binom[i][j - 1], (diff - j + 1)), inv[j]); } } vector<vector<int>> dp(S, vector<int>(N + 1)); for (int i = 0; i < S; ++i) { dp[i][0] = 1; } for (int i = 0; i < N; ++i) { int nw = 1; for (int j = 0; j < S - 1; ++j) { int a = 0; bool in_range = (A[i] <= ranges[j] && ranges[j + 1] <= B[i]); for (int k = N - 1; k > 0; --k) { if (k != 0) { a = add(a, mul(dp[j][k], binom[j][k])); } if (in_range) { dp[j][k + 1] = add(dp[j][k + 1], dp[j][k]); } } if (in_range) { dp[j][1] = add(dp[j][1], nw); } nw = add(nw, a); } } int ans = 0; for (int i = 0; i < S - 1; ++i) { for (int j = 1; j <= N; ++j) { ans = add(ans, mul(dp[i][j], binom[i][j])); } } cout << ans << '\n'; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...