#include<set> #include<map> #include<queue> #include<vector> #include<algorithm> #include<bits/stdc++.h> #define pr pair #define f first #define s second #define ll long long #define mp make_pair #define pll pr<ll,ll> #define pii pr<int,int> #define piii pr<int,pii> using namespace std; int gl[20][500005],gr[20][500005]; int l[500005],r[500005]; int met[500005]; int s[500005]; const ll m=1e9+7; ll pw(ll a,ll b=m-2) { ll r=1; while(b>0) { if(b&1) r=r*a%m; a=a*a%m; b>>=1; } return r; } int fl(int i,int b) { for(int j=19;j>=0;j--) { if(gl[j][i]>=b) i=gl[j][i]; } return i; } int fr(int i,int b) { for(int j=19;j>=0;j--) { if(gr[j][i]>=b) i=gr[j][i]; } return i; } int main() { ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<=n;i++) cin>>l[i]>>r[i]; // for(int i=1;i<=n;i++) l[i]=i,r[i]=2*n-i+1; l[0]=0; r[0]=2*n+1; multiset<piii> st; multiset<piii>::iterator i,j; for(int o=n;o>0;o--) { i=st.lower_bound(mp(l[o],mp(0,0))); j=st.lower_bound(mp(r[o],mp(0,0))); for(;i!=j;) { pii x=(*i).s; if(x.s==0) gl[0][x.f]=o; else gr[0][x.f]=o; st.erase(i++); } st.insert(mp(l[o],mp(o,0))); st.insert(mp(r[o],mp(o,1))); } for(int i=1;i<20;i++) { for(int j=1;j<=n;j++) gl[i][j]=gl[i-1][gl[i-1][j]]; for(int j=1;j<=n;j++) gr[i][j]=gr[i-1][gr[i-1][j]]; } for(int i=1;i<=n;i++) { int vl=gl[0][i]; int vr=gr[0][i]; vl=fr(vl,vr); vr=fl(vr,vl); int lb=0,m,rb=min(vl,vr)+1; while(lb<rb-1) { m=lb+rb>>1; int x=fr(vl,m); int y=fl(vr,m); if(r[x]>=l[y]) lb=m; else rb=m; } met[i]=fr(vl,lb); // cout<<"Ng "<<i<<" "<<gl[0][i]<<' '<<gr[0][i]<<" "<<vl<<' '<<lb<<' '<<met[i]<<endl; } ll ans=0; for(int i=n;i>0;i--) { s[i]++; // cout<<s[i]<<' '<<met[i]<<endl; s[gl[0][i]]+=s[i]; s[gr[0][i]]+=s[i]; s[met[i]]-=s[i]; ans+=pw(s[i]); } cout<<ans%m<<endl; return 0; }/* 5 1 10 2 4 5 6 7 9 3 8 */
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 108 109 110 111 112 113 114 115 | #include<set> #include<map> #include<queue> #include<vector> #include<algorithm> #include<bits/stdc++.h> #define pr pair #define f first #define s second #define ll long long #define mp make_pair #define pll pr<ll,ll> #define pii pr<int,int> #define piii pr<int,pii> using namespace std; int gl[20][500005],gr[20][500005]; int l[500005],r[500005]; int met[500005]; int s[500005]; const ll m=1e9+7; ll pw(ll a,ll b=m-2) { ll r=1; while(b>0) { if(b&1) r=r*a%m; a=a*a%m; b>>=1; } return r; } int fl(int i,int b) { for(int j=19;j>=0;j--) { if(gl[j][i]>=b) i=gl[j][i]; } return i; } int fr(int i,int b) { for(int j=19;j>=0;j--) { if(gr[j][i]>=b) i=gr[j][i]; } return i; } int main() { ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<=n;i++) cin>>l[i]>>r[i]; // for(int i=1;i<=n;i++) l[i]=i,r[i]=2*n-i+1; l[0]=0; r[0]=2*n+1; multiset<piii> st; multiset<piii>::iterator i,j; for(int o=n;o>0;o--) { i=st.lower_bound(mp(l[o],mp(0,0))); j=st.lower_bound(mp(r[o],mp(0,0))); for(;i!=j;) { pii x=(*i).s; if(x.s==0) gl[0][x.f]=o; else gr[0][x.f]=o; st.erase(i++); } st.insert(mp(l[o],mp(o,0))); st.insert(mp(r[o],mp(o,1))); } for(int i=1;i<20;i++) { for(int j=1;j<=n;j++) gl[i][j]=gl[i-1][gl[i-1][j]]; for(int j=1;j<=n;j++) gr[i][j]=gr[i-1][gr[i-1][j]]; } for(int i=1;i<=n;i++) { int vl=gl[0][i]; int vr=gr[0][i]; vl=fr(vl,vr); vr=fl(vr,vl); int lb=0,m,rb=min(vl,vr)+1; while(lb<rb-1) { m=lb+rb>>1; int x=fr(vl,m); int y=fl(vr,m); if(r[x]>=l[y]) lb=m; else rb=m; } met[i]=fr(vl,lb); // cout<<"Ng "<<i<<" "<<gl[0][i]<<' '<<gr[0][i]<<" "<<vl<<' '<<lb<<' '<<met[i]<<endl; } ll ans=0; for(int i=n;i>0;i--) { s[i]++; // cout<<s[i]<<' '<<met[i]<<endl; s[gl[0][i]]+=s[i]; s[gr[0][i]]+=s[i]; s[met[i]]-=s[i]; ans+=pw(s[i]); } cout<<ans%m<<endl; return 0; }/* 5 1 10 2 4 5 6 7 9 3 8 */ |