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