#include<cstdio>
#include<algorithm>
#include<unordered_map>
#include<map>
#include<utility>
#define MAXN 300003
const int MOD = 1000000007;
const long long INF = 2000000000000000007LL;
using namespace std;
int n;
long long a[MAXN];
long long r[MAXN];
map<pair<int, int>, int> wyniki;
int wynik(int indeks, int nie_wybuchaj_indeksu) {
pair<int, int> para_indeksow = make_pair(indeks, nie_wybuchaj_indeksu);
if (wyniki.find(para_indeksow) != wyniki.end()) {
return wyniki[para_indeksow];
}
if (indeks == n) {
return 1;
}
long long max_r = a[indeks] + r[indeks], min_r = a[indeks] - r[indeks];
int j = indeks;
while(a[j+1] <= max_r) {
max_r = std::max(max_r, a[j+1] + r[j+1]);
min_r = std::min(min_r, a[j+1] - r[j+1]);
j++;
}
int wynik1 = 0;
if (min_r > a[nie_wybuchaj_indeksu]) {
wynik1 = wynik(j+1, nie_wybuchaj_indeksu);
}
int wynik0 = wynik(indeks + 1, indeks);
int res = (wynik0 + wynik1) % MOD;
wyniki[para_indeksow] = res;
return res;
}
int main () {
scanf("%d", &n);
for (int i = 0; i < n; i++) {
scanf("%lld %lld", &a[i], &r[i]);
}
a[n] = INF;
r[n] = 0;
a[n+1] = -INF;
r[n+1] = 0;
printf("%d\n", wynik(0, n+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 | #include<cstdio> #include<algorithm> #include<unordered_map> #include<map> #include<utility> #define MAXN 300003 const int MOD = 1000000007; const long long INF = 2000000000000000007LL; using namespace std; int n; long long a[MAXN]; long long r[MAXN]; map<pair<int, int>, int> wyniki; int wynik(int indeks, int nie_wybuchaj_indeksu) { pair<int, int> para_indeksow = make_pair(indeks, nie_wybuchaj_indeksu); if (wyniki.find(para_indeksow) != wyniki.end()) { return wyniki[para_indeksow]; } if (indeks == n) { return 1; } long long max_r = a[indeks] + r[indeks], min_r = a[indeks] - r[indeks]; int j = indeks; while(a[j+1] <= max_r) { max_r = std::max(max_r, a[j+1] + r[j+1]); min_r = std::min(min_r, a[j+1] - r[j+1]); j++; } int wynik1 = 0; if (min_r > a[nie_wybuchaj_indeksu]) { wynik1 = wynik(j+1, nie_wybuchaj_indeksu); } int wynik0 = wynik(indeks + 1, indeks); int res = (wynik0 + wynik1) % MOD; wyniki[para_indeksow] = res; return res; } int main () { scanf("%d", &n); for (int i = 0; i < n; i++) { scanf("%lld %lld", &a[i], &r[i]); } a[n] = INF; r[n] = 0; a[n+1] = -INF; r[n+1] = 0; printf("%d\n", wynik(0, n+1)); return 0; } |
English