#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int MOD = 1'000'000'007;
int main() {
int N;
cin >> N;
vector<pair<int, int>> events(N);
vector<pair<int, int>> seq(2 * N); // arrival and departure
for (int i = 0; i < N; ++i) {
cin >> events[i].first >> events[i].second;
seq[events[i].first - 1] = {i, 1}; // arrival
seq[events[i].second - 1] = {i, -1}; // departure
}
vector<vector<int>> dp(2 * N + 1, vector<int>(2 * N + 1, 0));
for (int i = 0; i <= 2 * N; ++i)
dp[i][i] = 1; // base case: empty segment
for (int len = 2; len <= 2 * N; len += 2) {
for (int l = 0; l + len <= 2 * N; ++l) {
int r = l + len;
for (int m = l + 1; m < r; m += 2) {
if (seq[l].second == 1 && seq[m].second == -1 && seq[l].first == seq[m].first) {
int left = dp[l + 1][m];
int right = dp[m + 1][r];
dp[l][r] = (dp[l][r] + 1LL * left * right % MOD) % MOD;
}
}
}
}
cout << dp[0][2 * N] << endl;
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |