#include <bits/stdc++.h> using namespace std; typedef long long LL; vector<vector<int>> graf; vector<vector<int>> odwr_graf; const int N=1048576; const LL m=1e9+7; LL inv(LL a) { return a<=1 ? a:m-(m/a)*inv(m%a)%m; } LL silnia[N]; int S[2*N+100]; int ile_wchodzacych[N]; bool mark[N]; vector<int> odw; void DFS(int u){ mark[u]=true; odw.push_back(u); for(int i=0; i<odwr_graf[u].size(); i++){ if(!mark[odwr_graf[u][i]]){ DFS(odwr_graf[u][i]); } } } void update(int l, int r, int x){ l+=N; r+=N+2; while(l+1!=r){ if(l%2==0) S[l+1]=x; if(r%2==1) S[r-1]=x; l/=2; r/=2; } } int query(int x){ x+=N+1; int wyn=0; for(; x!=0; x/=2) wyn=max(wyn, S[x]); return wyn; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, a, b; cin>>n; graf.resize(n+1); odwr_graf.resize(n+1); for(int i=1; i<=n; i++){ cin>>a>>b; int x=query(a); int y=query(b); odwr_graf[x].push_back(i); graf[i].push_back(x); if(x!=y) odwr_graf[y].push_back(i); if(x!=y) graf[i].push_back(y); update(a, b, i); } /*for(int i=0; i<=n; i++){ cerr<<i<<": "; for(int j=0; j<odwr_graf[i].size(); j++){ cerr<<odwr_graf[i][j]<<' '; } cerr<<'\n'; }*/ silnia[0]=1; for(int i=1; i<=n; i++){ silnia[i]=silnia[i-1]*i; silnia[i]%=m; } for(int i=1; i<=n; i++){ DFS(i); ile_wchodzacych[i]=odw.size()-1; for(int i=0; i<odw.size(); i++) mark[odw[i]]=false; odw.clear(); } LL wyn1=0; for(int i=1; i<=n; i++){ wyn1+=silnia[n]*inv(ile_wchodzacych[i]+1); //cerr<<ile_wchodzacych[i]<<' '; wyn1%=m; } //cerr<<wyn1; cout<<(wyn1*inv(silnia[n]))%m; 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 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 | #include <bits/stdc++.h> using namespace std; typedef long long LL; vector<vector<int>> graf; vector<vector<int>> odwr_graf; const int N=1048576; const LL m=1e9+7; LL inv(LL a) { return a<=1 ? a:m-(m/a)*inv(m%a)%m; } LL silnia[N]; int S[2*N+100]; int ile_wchodzacych[N]; bool mark[N]; vector<int> odw; void DFS(int u){ mark[u]=true; odw.push_back(u); for(int i=0; i<odwr_graf[u].size(); i++){ if(!mark[odwr_graf[u][i]]){ DFS(odwr_graf[u][i]); } } } void update(int l, int r, int x){ l+=N; r+=N+2; while(l+1!=r){ if(l%2==0) S[l+1]=x; if(r%2==1) S[r-1]=x; l/=2; r/=2; } } int query(int x){ x+=N+1; int wyn=0; for(; x!=0; x/=2) wyn=max(wyn, S[x]); return wyn; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n, a, b; cin>>n; graf.resize(n+1); odwr_graf.resize(n+1); for(int i=1; i<=n; i++){ cin>>a>>b; int x=query(a); int y=query(b); odwr_graf[x].push_back(i); graf[i].push_back(x); if(x!=y) odwr_graf[y].push_back(i); if(x!=y) graf[i].push_back(y); update(a, b, i); } /*for(int i=0; i<=n; i++){ cerr<<i<<": "; for(int j=0; j<odwr_graf[i].size(); j++){ cerr<<odwr_graf[i][j]<<' '; } cerr<<'\n'; }*/ silnia[0]=1; for(int i=1; i<=n; i++){ silnia[i]=silnia[i-1]*i; silnia[i]%=m; } for(int i=1; i<=n; i++){ DFS(i); ile_wchodzacych[i]=odw.size()-1; for(int i=0; i<odw.size(); i++) mark[odw[i]]=false; odw.clear(); } LL wyn1=0; for(int i=1; i<=n; i++){ wyn1+=silnia[n]*inv(ile_wchodzacych[i]+1); //cerr<<ile_wchodzacych[i]<<' '; wyn1%=m; } //cerr<<wyn1; cout<<(wyn1*inv(silnia[n]))%m; return 0; } |