#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; } |
English