#include <bits/stdc++.h> using namespace std; const int MX=500050,md=1000000007; int n,w[MX],cnt[MX]; pair<int,int> a[MX]; vector<unsigned int> b[MX]; set<int> g[MX]; long long P,Q=1; long long pw(long long x, int y) { if (y==0) return 1LL; if (y&1) return (pw(x,y-1)*x)%md; long long z=pw(x,y/2); return (z*z)%md; } void updres(long long q) { P=(P*q+Q)%md; Q=(Q*q)%md; } void add(int i, int j) { b[i][j/32]|=(1U<<(j&31)); } int main() { scanf("%d",&n); for (int i=0; i<n; i++) scanf("%d%d",&a[i].first,&a[i].second); reverse(a,a+n); for (int i=0; i<n; i++) { w[a[i].first]=i; w[a[i].second]=i; } set<int> all; for (int i=0; i<n; i++) { auto it=all.upper_bound(a[i].first); while (it!=all.end() && *it<a[i].second) { g[i].insert(-w[*it]); all.erase(it); it=all.upper_bound(a[i].first); } for (int j: g[i]) ++cnt[-j]; all.insert(a[i].first); all.insert(a[i].second); } int len=(n-1)/32+1; for (int i=0; i<n; i++) { for (int j: g[i]) if (cnt[-j]==1) { --cnt[-j]; swap(b[i],b[-j]); break; } int len=i/32+1; b[i].resize(len); for (int j: g[i]) if (cnt[-j]) { int plen=(-j)/32; for (int k=0; k<=plen; k++) b[i][k]|=b[-j][k]; if (--cnt[-j]==0) b[-j].clear(); } int prv=1; for (int k=0; k<len; k++) prv+=__builtin_popcount(b[i][k]); updres(prv); if (cnt[i]==0) b[i].clear(); else add(i,i); } printf("%lld\n",(P*pw(Q,md-2))%md); 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 | #include <bits/stdc++.h> using namespace std; const int MX=500050,md=1000000007; int n,w[MX],cnt[MX]; pair<int,int> a[MX]; vector<unsigned int> b[MX]; set<int> g[MX]; long long P,Q=1; long long pw(long long x, int y) { if (y==0) return 1LL; if (y&1) return (pw(x,y-1)*x)%md; long long z=pw(x,y/2); return (z*z)%md; } void updres(long long q) { P=(P*q+Q)%md; Q=(Q*q)%md; } void add(int i, int j) { b[i][j/32]|=(1U<<(j&31)); } int main() { scanf("%d",&n); for (int i=0; i<n; i++) scanf("%d%d",&a[i].first,&a[i].second); reverse(a,a+n); for (int i=0; i<n; i++) { w[a[i].first]=i; w[a[i].second]=i; } set<int> all; for (int i=0; i<n; i++) { auto it=all.upper_bound(a[i].first); while (it!=all.end() && *it<a[i].second) { g[i].insert(-w[*it]); all.erase(it); it=all.upper_bound(a[i].first); } for (int j: g[i]) ++cnt[-j]; all.insert(a[i].first); all.insert(a[i].second); } int len=(n-1)/32+1; for (int i=0; i<n; i++) { for (int j: g[i]) if (cnt[-j]==1) { --cnt[-j]; swap(b[i],b[-j]); break; } int len=i/32+1; b[i].resize(len); for (int j: g[i]) if (cnt[-j]) { int plen=(-j)/32; for (int k=0; k<=plen; k++) b[i][k]|=b[-j][k]; if (--cnt[-j]==0) b[-j].clear(); } int prv=1; for (int k=0; k<len; k++) prv+=__builtin_popcount(b[i][k]); updres(prv); if (cnt[i]==0) b[i].clear(); else add(i,i); } printf("%lld\n",(P*pw(Q,md-2))%md); return 0; } |