#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> PII;
typedef pair<long long,int> PLI;
const int mod = 1e9+7;
PII segs[500005];
bitset<50005> mask[100005];
long long pot(long long a, long long x){
if(x == 0) return 1;
if(x&1) return pot(a, x-1)*a%mod;
long long tmp = pot(a, x/2);
return tmp*tmp%mod;
}
int main(){
ios_base::sync_with_stdio(0);
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>segs[i].first>>segs[i].second;
}
long long res = 0;
set<int> pos;
for(int i=n;i>0;i--){
bitset<50005> cur;
cur[i] = 1;
while(true){
auto it = pos.lower_bound(segs[i].first);
if(it == pos.end()) break;
if(*it > segs[i].second) break;
pos.erase(it);
cur |= mask[*it];
}
int cnt = cur.count();
res = (res+pot(cnt, mod-2))%mod;
mask[segs[i].first] = cur;
mask[segs[i].second] = cur;
pos.insert(segs[i].first);
pos.insert(segs[i].second);
}
cout<<res<<endl;
}
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 | #include <bits/stdc++.h> using namespace std; typedef pair<int,int> PII; typedef pair<long long,int> PLI; const int mod = 1e9+7; PII segs[500005]; bitset<50005> mask[100005]; long long pot(long long a, long long x){ if(x == 0) return 1; if(x&1) return pot(a, x-1)*a%mod; long long tmp = pot(a, x/2); return tmp*tmp%mod; } int main(){ ios_base::sync_with_stdio(0); int n; cin>>n; for(int i=1;i<=n;i++){ cin>>segs[i].first>>segs[i].second; } long long res = 0; set<int> pos; for(int i=n;i>0;i--){ bitset<50005> cur; cur[i] = 1; while(true){ auto it = pos.lower_bound(segs[i].first); if(it == pos.end()) break; if(*it > segs[i].second) break; pos.erase(it); cur |= mask[*it]; } int cnt = cur.count(); res = (res+pot(cnt, mod-2))%mod; mask[segs[i].first] = cur; mask[segs[i].second] = cur; pos.insert(segs[i].first); pos.insert(segs[i].second); } cout<<res<<endl; } |
English