#include <bits/stdc++.h> #define debug(x) cout<<#x<<" = "<<x<<"\n" #define all(x) x.begin(),x.end() #define inf 1e18 #define mod 1000000007 using namespace std; using ll = long long; using ld = long double; template <typename H, typename T> ostream& operator<<(ostream& os, pair<H, T> m){return os <<"("<< m.first<<", "<<m.second<<")";} template <typename H> ostream& operator<<(ostream& os, vector<H> V){os<<"{";for(int i=0; i<(int)V.size(); i++){if(i)os<<" ";os<<V[i];}os<<"}";return os;} mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); int losuj(int a, int b){return rng()%(b-a+1)+a;} #define rozmiar 500100 int n, l[rozmiar], p[rozmiar], prawy[rozmiar], lewy[rozmiar]; long long odp=0; set<pair<int, pair<int, int>>> nieznane; vector<int> graf[rozmiar]; bool visited[rozmiar]; long long szybpot(long long a, long long b){ if(b==0)return 1; if(b%2==0){ long long o=szybpot(a,b/2); return (o*o)%mod; } return (a*szybpot(a, b-1))%mod; } long long odwr(long long a){return szybpot(a, mod-2);} int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; for(int i=1;i<=n;i++){ cin >> l[i] >>p[i]; } l[0]=0; p[0]=2*n+1; set<pair<int, pair<int, int>>>::iterator itr; vector<pair<int, pair<int, int>>> us; bitset<70000> dasie[70000]; for(int i=n;i>0;i--){ us.clear(); for(itr=nieznane.lower_bound({l[i], {0, 0}});itr!=nieznane.lower_bound({p[i], {0, 1}});itr++){ us.push_back(*itr); //if((*itr).second.second==1)prawy[(*itr).second.first]=i; //if((*itr).second.second==0)lewy[(*itr).second.first]=i; graf[(*itr).second.first].push_back(i); } for(auto i:us)nieznane.erase(i); nieznane.insert({l[i], {i, 0}}); nieznane.insert({p[i], {i, 1}}); } for(int i=n;i>=1;i--){ dasie[i][i]=1; //cout << i << " "; //cout << prawy[i] << " " << lewy[i] << endl; } for(int i=n;i>=1;i--){ for(int j:graf[i]){ dasie[j]=dasie[j]|dasie[i]; } } for(int i=1;i<=n;i++){ odp+=odwr(dasie[i].count()); odp%=mod; } cout << odp << endl; 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 | #include <bits/stdc++.h> #define debug(x) cout<<#x<<" = "<<x<<"\n" #define all(x) x.begin(),x.end() #define inf 1e18 #define mod 1000000007 using namespace std; using ll = long long; using ld = long double; template <typename H, typename T> ostream& operator<<(ostream& os, pair<H, T> m){return os <<"("<< m.first<<", "<<m.second<<")";} template <typename H> ostream& operator<<(ostream& os, vector<H> V){os<<"{";for(int i=0; i<(int)V.size(); i++){if(i)os<<" ";os<<V[i];}os<<"}";return os;} mt19937 rng(chrono::high_resolution_clock::now().time_since_epoch().count()); int losuj(int a, int b){return rng()%(b-a+1)+a;} #define rozmiar 500100 int n, l[rozmiar], p[rozmiar], prawy[rozmiar], lewy[rozmiar]; long long odp=0; set<pair<int, pair<int, int>>> nieznane; vector<int> graf[rozmiar]; bool visited[rozmiar]; long long szybpot(long long a, long long b){ if(b==0)return 1; if(b%2==0){ long long o=szybpot(a,b/2); return (o*o)%mod; } return (a*szybpot(a, b-1))%mod; } long long odwr(long long a){return szybpot(a, mod-2);} int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cin >> n; for(int i=1;i<=n;i++){ cin >> l[i] >>p[i]; } l[0]=0; p[0]=2*n+1; set<pair<int, pair<int, int>>>::iterator itr; vector<pair<int, pair<int, int>>> us; bitset<70000> dasie[70000]; for(int i=n;i>0;i--){ us.clear(); for(itr=nieznane.lower_bound({l[i], {0, 0}});itr!=nieznane.lower_bound({p[i], {0, 1}});itr++){ us.push_back(*itr); //if((*itr).second.second==1)prawy[(*itr).second.first]=i; //if((*itr).second.second==0)lewy[(*itr).second.first]=i; graf[(*itr).second.first].push_back(i); } for(auto i:us)nieznane.erase(i); nieznane.insert({l[i], {i, 0}}); nieznane.insert({p[i], {i, 1}}); } for(int i=n;i>=1;i--){ dasie[i][i]=1; //cout << i << " "; //cout << prawy[i] << " " << lewy[i] << endl; } for(int i=n;i>=1;i--){ for(int j:graf[i]){ dasie[j]=dasie[j]|dasie[i]; } } for(int i=1;i<=n;i++){ odp+=odwr(dasie[i].count()); odp%=mod; } cout << odp << endl; return 0; } |