#include <bits/stdc++.h> using namespace std; int n; struct M{ long long x; long long r; }; struct Z{ long long x; long long y; }; bool cmp(Z a, Z b) { if(a.y!=b.y) return a.y < b.y; return a.x > b.x; } M miny[300000]; Z zakres[300001]; long long DP[300001]; long long P = 1000000007ll; void solve() { for(int i =0;i<n;i++){ long long z_min = miny[i].x-miny[i].r; long long z_max = miny[i].x+miny[i].r; int j1 = i+1; int j2 = i-1; while(true){ bool ok = false; if(z_max >= miny[j1].x && j1<n) { z_max = max(z_max, miny[j1].x+miny[j1].r); z_min = min(z_min, miny[j1].x-miny[j1].r); j1++; ok = true; } if(z_min <= miny[j2].x && j2>=0 ) { z_max = max(z_max, miny[j2].x+miny[j2].r); z_min = min(z_min, miny[j2].x-miny[j2].r); j2--; ok = true; } if(!ok)break; } zakres[i].x = j2+1 + 1; zakres[i].y = j1-1+ 1 ; } sort(zakres,zakres+n, cmp); //redukuj int j = 0; for(int i =1;i<n;i++){ if(zakres[i].x != zakres[j].x || zakres[i].y != zakres[j].y) { j++; zakres[j].x = zakres[i].x; zakres[j].y = zakres[i].y; } } int N = n; n = j+1; /* for(int i =0;i<n;i++){ cout<<zakres[i].x<<" - "<<zakres[i].y<<"\n"; }*/ DP[0] = 1; for(int i =0;i<n;i++) { DP[ zakres[i].y]++; for(int j = i-1;j>=0;j--){ if(zakres[i].x > zakres[j].x && zakres[i].x <= zakres[j].y){ DP[ zakres[i].y]++; // cout<<"+"; } } for(int j = zakres[i].x-1;j>=1;j--){ DP[ zakres[i].y]+=DP[j]; DP[zakres[i].y]%=P; } // cout<<DP[ zakres[i].y]<<" "; } long long W = 0; for(int i =0;i<=zakres[n-1].y;i++) { W+=DP[i]; W%=P; } cout<<W<<"\n"; }; int main() { cin>>n; for(int i =0;i<n;i++){ cin>>miny[i].x>>miny[i].r; } solve(); 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 | #include <bits/stdc++.h> using namespace std; int n; struct M{ long long x; long long r; }; struct Z{ long long x; long long y; }; bool cmp(Z a, Z b) { if(a.y!=b.y) return a.y < b.y; return a.x > b.x; } M miny[300000]; Z zakres[300001]; long long DP[300001]; long long P = 1000000007ll; void solve() { for(int i =0;i<n;i++){ long long z_min = miny[i].x-miny[i].r; long long z_max = miny[i].x+miny[i].r; int j1 = i+1; int j2 = i-1; while(true){ bool ok = false; if(z_max >= miny[j1].x && j1<n) { z_max = max(z_max, miny[j1].x+miny[j1].r); z_min = min(z_min, miny[j1].x-miny[j1].r); j1++; ok = true; } if(z_min <= miny[j2].x && j2>=0 ) { z_max = max(z_max, miny[j2].x+miny[j2].r); z_min = min(z_min, miny[j2].x-miny[j2].r); j2--; ok = true; } if(!ok)break; } zakres[i].x = j2+1 + 1; zakres[i].y = j1-1+ 1 ; } sort(zakres,zakres+n, cmp); //redukuj int j = 0; for(int i =1;i<n;i++){ if(zakres[i].x != zakres[j].x || zakres[i].y != zakres[j].y) { j++; zakres[j].x = zakres[i].x; zakres[j].y = zakres[i].y; } } int N = n; n = j+1; /* for(int i =0;i<n;i++){ cout<<zakres[i].x<<" - "<<zakres[i].y<<"\n"; }*/ DP[0] = 1; for(int i =0;i<n;i++) { DP[ zakres[i].y]++; for(int j = i-1;j>=0;j--){ if(zakres[i].x > zakres[j].x && zakres[i].x <= zakres[j].y){ DP[ zakres[i].y]++; // cout<<"+"; } } for(int j = zakres[i].x-1;j>=1;j--){ DP[ zakres[i].y]+=DP[j]; DP[zakres[i].y]%=P; } // cout<<DP[ zakres[i].y]<<" "; } long long W = 0; for(int i =0;i<=zakres[n-1].y;i++) { W+=DP[i]; W%=P; } cout<<W<<"\n"; }; int main() { cin>>n; for(int i =0;i<n;i++){ cin>>miny[i].x>>miny[i].r; } solve(); return 0; } |