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