#include <iostream> #include <algorithm> #include <vector> #include <cstdio> using namespace std; vector < pair <int,int> > V; vector <int> graf[1000000]; int l=0; bool odw[1000010]; int stos[1000010]; int byl[1000000]; int skladowa[1000000]; void dfs(int q) { odw[q]=1; for (int j=0; j<graf[q].size(); j++) if (odw[graf[q][j]]==0) dfs(graf[q][j]); stos[l]=q; l++; } int ile=0; void ndfs(int q,int x) { ile++; odw[q]=x; // cout<<q<<" "<<x<<" "<<odw[4]<<" "<<odw[5]<<endl; for (int j=0; j<graf[q].size(); j++) if (odw[graf[q][j]]<x) ndfs(graf[q][j],x); } void sklad(int q,int nr) { skladowa[q]=nr; for (int j=0; j<graf[q].size(); j++) { if (skladowa[graf[q][j]]==0) sklad(graf[q][j],nr); else nr=skladowa[graf[q][j]]; } skladowa[q]=nr; } int main() { int n,a,b; scanf("%d", &n); for (int i=0; i<n; i++) { scanf("%d%d", &a,&b); V.push_back(make_pair(a,b)); } for (int i=0; i<n; i++) { for (int j=i+1; j<n; j++) if (V[i].first+V[i].second>=V[j].first) graf[i].push_back(j); for (int j=i-1; j>=0; j--) if (V[i].first-V[i].second<=V[j].first) graf[i].push_back(j); } int numer=1; for (int i=0; i<n; i++) { if (skladowa[i]==0) sklad(i,numer); if (skladowa[i]==numer) numer++; } for (int i=0; i<n; i++) { if (odw[i]==0) dfs(i); } for (int i=0; i<n; i++) odw[i]=0; long long wyn=0LL; long long general=1; int u=0; for (int i=0; i<l; i++) { ile=0; int kand=stos[i]; if (i>0 && skladowa[stos[i]]!=skladowa[stos[i-1]]) { //cout<<wyn<<"\n"; general*=(wyn+1LL); wyn%=1000000007; wyn=0LL; u=0; } ndfs(kand,u+1); //cout<<"TU"; int Y=((u+1)-ile+1); if (Y<=0) continue; else wyn+=(long long)(Y); u++; } printf("%lld\n",general+1); 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 109 110 111 112 113 114 115 116 117 118 119 120 121 122 | #include <iostream> #include <algorithm> #include <vector> #include <cstdio> using namespace std; vector < pair <int,int> > V; vector <int> graf[1000000]; int l=0; bool odw[1000010]; int stos[1000010]; int byl[1000000]; int skladowa[1000000]; void dfs(int q) { odw[q]=1; for (int j=0; j<graf[q].size(); j++) if (odw[graf[q][j]]==0) dfs(graf[q][j]); stos[l]=q; l++; } int ile=0; void ndfs(int q,int x) { ile++; odw[q]=x; // cout<<q<<" "<<x<<" "<<odw[4]<<" "<<odw[5]<<endl; for (int j=0; j<graf[q].size(); j++) if (odw[graf[q][j]]<x) ndfs(graf[q][j],x); } void sklad(int q,int nr) { skladowa[q]=nr; for (int j=0; j<graf[q].size(); j++) { if (skladowa[graf[q][j]]==0) sklad(graf[q][j],nr); else nr=skladowa[graf[q][j]]; } skladowa[q]=nr; } int main() { int n,a,b; scanf("%d", &n); for (int i=0; i<n; i++) { scanf("%d%d", &a,&b); V.push_back(make_pair(a,b)); } for (int i=0; i<n; i++) { for (int j=i+1; j<n; j++) if (V[i].first+V[i].second>=V[j].first) graf[i].push_back(j); for (int j=i-1; j>=0; j--) if (V[i].first-V[i].second<=V[j].first) graf[i].push_back(j); } int numer=1; for (int i=0; i<n; i++) { if (skladowa[i]==0) sklad(i,numer); if (skladowa[i]==numer) numer++; } for (int i=0; i<n; i++) { if (odw[i]==0) dfs(i); } for (int i=0; i<n; i++) odw[i]=0; long long wyn=0LL; long long general=1; int u=0; for (int i=0; i<l; i++) { ile=0; int kand=stos[i]; if (i>0 && skladowa[stos[i]]!=skladowa[stos[i-1]]) { //cout<<wyn<<"\n"; general*=(wyn+1LL); wyn%=1000000007; wyn=0LL; u=0; } ndfs(kand,u+1); //cout<<"TU"; int Y=((u+1)-ile+1); if (Y<=0) continue; else wyn+=(long long)(Y); u++; } printf("%lld\n",general+1); return 0; } |