#include <bits/stdc++.h>
using namespace std;
#define ff first
#define ss second
#define ll long long
const long long mod = 1000000007;
void dfs(int v, vector <int>& ile, vector <bool>& vis, vector <vector <int> > &g, vector <bitset <100000> >& bi) {
vis[v] = 1;
for (auto w : g[v]) {
if (!vis[w]) {
// cout << v << " " << w << "<\n";
dfs(w, ile, vis, g, bi);
}
bi[v] |= bi[w];
bi[v][w] = 1;
}
ile[v] = (int)bi[v].count();
}
ll powmod(ll a, ll b) {
ll res = 1;
while (b > 0) {
if (b % 2)
res *= a;
a *= a;
a %= mod;
res %= mod;
b /= 2;
}
return res;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
int n;
cin >> n;
vector <pair <int, int> > v(n);
for (int i = n-1; i >= 0; i--) {
cin >> v[i].ff >> v[i].ss;
}
vector <vector <int> > woda(n);
vector <vector <int> > g(n);
set <pair <int, int> > s;
for (int i = 0; i < n; i++) {
pair <int, int> p1 = {v[i].ff, i};
pair <int, int> p2 = {v[i].ss, i};
while (true) {
auto u = upper_bound(s.begin(), s.end(), p1);
if (u != s.end() && (*u).ff < v[i].ss) {
woda[(*u).ss].push_back(i);
g[i].push_back((*u).ss);
s.erase(u);
}
else
break;
}
s.insert(p1);
s.insert(p2);
}
vector <int> ile(n);
vector <bool> vis(n);
vector <bitset <100000> > bi(n);
for (int i = n-1; i >= 0; i--) {
if (!vis[i]) {
dfs(i, ile, vis, g, bi);
}
}
ll lic = 0;
ll mia = 1;
for (int i = 0; i < n; i++) {
lic *= (ile[i]+1);
lic += mia;
mia *= (ile[i]+1);
lic %= mod;
mia %= mod;
}
cout << lic * powmod(mia, mod-2) % mod << "\n";
}
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 | #include <bits/stdc++.h> using namespace std; #define ff first #define ss second #define ll long long const long long mod = 1000000007; void dfs(int v, vector <int>& ile, vector <bool>& vis, vector <vector <int> > &g, vector <bitset <100000> >& bi) { vis[v] = 1; for (auto w : g[v]) { if (!vis[w]) { // cout << v << " " << w << "<\n"; dfs(w, ile, vis, g, bi); } bi[v] |= bi[w]; bi[v][w] = 1; } ile[v] = (int)bi[v].count(); } ll powmod(ll a, ll b) { ll res = 1; while (b > 0) { if (b % 2) res *= a; a *= a; a %= mod; res %= mod; b /= 2; } return res; } int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); int n; cin >> n; vector <pair <int, int> > v(n); for (int i = n-1; i >= 0; i--) { cin >> v[i].ff >> v[i].ss; } vector <vector <int> > woda(n); vector <vector <int> > g(n); set <pair <int, int> > s; for (int i = 0; i < n; i++) { pair <int, int> p1 = {v[i].ff, i}; pair <int, int> p2 = {v[i].ss, i}; while (true) { auto u = upper_bound(s.begin(), s.end(), p1); if (u != s.end() && (*u).ff < v[i].ss) { woda[(*u).ss].push_back(i); g[i].push_back((*u).ss); s.erase(u); } else break; } s.insert(p1); s.insert(p2); } vector <int> ile(n); vector <bool> vis(n); vector <bitset <100000> > bi(n); for (int i = n-1; i >= 0; i--) { if (!vis[i]) { dfs(i, ile, vis, g, bi); } } ll lic = 0; ll mia = 1; for (int i = 0; i < n; i++) { lic *= (ile[i]+1); lic += mia; mia *= (ile[i]+1); lic %= mod; mia %= mod; } cout << lic * powmod(mia, mod-2) % mod << "\n"; } |
English