#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
const int N = 5e5 + 7, Z = 1024 * 1024;
long long mod = 1000000007;
int lsyn[N], rsyn[N];
int przedz[2 * Z + 7];
int ilu[N];
int odw[N];
int czas;
void ustaw(int l, int r, int val) {
l += Z - 1;
r += Z + 1;
while (l + 1 < r) {
if (l % 2 == 0) {
przedz[l + 1] = val;
}
if (r % 2 == 1) {
przedz[r - 1] = val;
}
l /= 2;
r /= 2;
}
}
int getmax(int x) {
x += Z;
int ret = 0;
while (x / 2 != 0) {
x /= 2;
ret = max(ret, przedz[x]);
}
return ret;
}
void dfs(int v) {
ilu[v]++;
odw[v] = czas;
if (lsyn[v] != 0 && odw[lsyn[v]] < czas)
dfs(lsyn[v]);
if (rsyn[v] != 0 && odw[rsyn[v]] < czas)
dfs(rsyn[v]);
}
long long binpow(long long a, long long n) {
long long ret = 1;
while (n) {
if (n % 2)
ret = (ret * a) % mod;
a = (a * a) % mod;
n /= 2;
}
return ret;
}
int main() {
int n, a, b;
cin >> n;
for (int h = 1; h <= n; h++) {
cin >> a >> b;
lsyn[h] = getmax(a);
rsyn[h] = getmax(b);
ustaw(a, b, h);
}
for (int h = 1; h <= n; h++) {
czas++;
dfs(h);
}
long long wyn = 0;
for (int h = 1; h <= n; h++) {
wyn += binpow(ilu[h], mod - 2);
}
wyn %= mod;
cout << wyn;
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 | #include <iostream> #include <vector> #include <algorithm> using namespace std; const int N = 5e5 + 7, Z = 1024 * 1024; long long mod = 1000000007; int lsyn[N], rsyn[N]; int przedz[2 * Z + 7]; int ilu[N]; int odw[N]; int czas; void ustaw(int l, int r, int val) { l += Z - 1; r += Z + 1; while (l + 1 < r) { if (l % 2 == 0) { przedz[l + 1] = val; } if (r % 2 == 1) { przedz[r - 1] = val; } l /= 2; r /= 2; } } int getmax(int x) { x += Z; int ret = 0; while (x / 2 != 0) { x /= 2; ret = max(ret, przedz[x]); } return ret; } void dfs(int v) { ilu[v]++; odw[v] = czas; if (lsyn[v] != 0 && odw[lsyn[v]] < czas) dfs(lsyn[v]); if (rsyn[v] != 0 && odw[rsyn[v]] < czas) dfs(rsyn[v]); } long long binpow(long long a, long long n) { long long ret = 1; while (n) { if (n % 2) ret = (ret * a) % mod; a = (a * a) % mod; n /= 2; } return ret; } int main() { int n, a, b; cin >> n; for (int h = 1; h <= n; h++) { cin >> a >> b; lsyn[h] = getmax(a); rsyn[h] = getmax(b); ustaw(a, b, h); } for (int h = 1; h <= n; h++) { czas++; dfs(h); } long long wyn = 0; for (int h = 1; h <= n; h++) { wyn += binpow(ilu[h], mod - 2); } wyn %= mod; cout << wyn; return 0; } |
English