#include <bits/stdc++.h> using namespace std; #ifdef DEBUG auto&operator<<(auto &o, pair<auto, auto> p) {o << "(" << p.first << ", " << p.second << ")"; return o;} auto operator<<(auto &o, auto x)->decltype(x.end(), o) {o<<"{"; for(auto e : x) o<<e<<", "; return o<<"}";} #define debug(X) cerr << "["#X"]: " << X << '\n'; #else #define cerr if(0)cout #define debug(X) ; #endif using ll = long long; #define all(v) (v).begin(), (v).end() #define ssize(x) int(x.size()) #define fi first #define se second #define mp make_pair #define eb emplace_back const int inf = 1e9, N = 80'000; const int mod = 1'000'000'007; bitset<N+5> reach[N+5]; void inc(int &a, int b) { a += b; if(a >= mod) a -= mod; } int mul(int a, int b) { return int(((ll)a*b)%mod); } int fpow(int a, int b) { if(b == 0) return 1; if(b%2 == 0) return fpow(mul(a, a), b/2); else return mul(a, fpow(a, b-1)); } int inv(int x) { return fpow(x, mod-2); } struct segtree { vector<int> tree; int base; segtree(int n) { base = 1; while (base < n) base *= 2; tree.resize(2*base, -inf); } void update(int l, int r, int x) { l += base-1; r += base+1; while(l/2 != r/2) { if(l%2 == 0) tree[l+1] = max(tree[l+1], x); if(r%2 == 1) tree[r-1] = max(tree[r-1], x); l /= 2; r /= 2; } } int query(int v) { v += base; int res = -inf; while (v) res = max(res, tree[v]), v /= 2; return res; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> l(n), r(n); for(int i = 0; i < n; ++i) { cin >> l[i] >> r[i]; l[i]--; r[i]--; } segtree t(2*n); vector<int> left(n), right(n); for(int i = 0; i < n; ++i) { left[i] = t.query(l[i]); right[i] = t.query(r[i]); if(left[i] == right[i]) right[i] = -inf; t.update(l[i], r[i], i); } vector<int> d(n); for(int i = n-1; i >= 0; --i) { reach[i][i] = 1; d[i] = reach[i].count(); if(left[i] > -inf) reach[left[i]] |= reach[i]; if(right[i] > -inf) reach[right[i]] |= reach[i]; } int res = 0; for(int x : d) inc(res, inv(x)); cout << res << '\n'; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 | #include <bits/stdc++.h> using namespace std; #ifdef DEBUG auto&operator<<(auto &o, pair<auto, auto> p) {o << "(" << p.first << ", " << p.second << ")"; return o;} auto operator<<(auto &o, auto x)->decltype(x.end(), o) {o<<"{"; for(auto e : x) o<<e<<", "; return o<<"}";} #define debug(X) cerr << "["#X"]: " << X << '\n'; #else #define cerr if(0)cout #define debug(X) ; #endif using ll = long long; #define all(v) (v).begin(), (v).end() #define ssize(x) int(x.size()) #define fi first #define se second #define mp make_pair #define eb emplace_back const int inf = 1e9, N = 80'000; const int mod = 1'000'000'007; bitset<N+5> reach[N+5]; void inc(int &a, int b) { a += b; if(a >= mod) a -= mod; } int mul(int a, int b) { return int(((ll)a*b)%mod); } int fpow(int a, int b) { if(b == 0) return 1; if(b%2 == 0) return fpow(mul(a, a), b/2); else return mul(a, fpow(a, b-1)); } int inv(int x) { return fpow(x, mod-2); } struct segtree { vector<int> tree; int base; segtree(int n) { base = 1; while (base < n) base *= 2; tree.resize(2*base, -inf); } void update(int l, int r, int x) { l += base-1; r += base+1; while(l/2 != r/2) { if(l%2 == 0) tree[l+1] = max(tree[l+1], x); if(r%2 == 1) tree[r-1] = max(tree[r-1], x); l /= 2; r /= 2; } } int query(int v) { v += base; int res = -inf; while (v) res = max(res, tree[v]), v /= 2; return res; } }; int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); int n; cin >> n; vector<int> l(n), r(n); for(int i = 0; i < n; ++i) { cin >> l[i] >> r[i]; l[i]--; r[i]--; } segtree t(2*n); vector<int> left(n), right(n); for(int i = 0; i < n; ++i) { left[i] = t.query(l[i]); right[i] = t.query(r[i]); if(left[i] == right[i]) right[i] = -inf; t.update(l[i], r[i], i); } vector<int> d(n); for(int i = n-1; i >= 0; --i) { reach[i][i] = 1; d[i] = reach[i].count(); if(left[i] > -inf) reach[left[i]] |= reach[i]; if(right[i] > -inf) reach[right[i]] |= reach[i]; } int res = 0; for(int x : d) inc(res, inv(x)); cout << res << '\n'; return 0; } |