#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; } |
English