#include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size() #define RS resize using VI = vector<int>; using VVI = vector<VI>; using PI = pair<int, int>; using VPI = vector<PI>; using VVPI = vector<VPI>; using VL = vector<L>; using VVL = vector<VL>; using VB = vector<bool>; using VC = vector<char>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); L mod = 1e9 + 7; int n; cin >> n; VL a(n), r(n); REP(i, n) cin >> a[i] >> r[i]; VVI prze(n); REP(i, n) { int k = i; L lr = a[i] - r[i], rr = a[i] + r[i]; while (k < n && (i == 0 || a[i - 1] < lr)) { if (k == n - 1 || a[k + 1] > rr) prze[k].EB(i); k++; if (k != n) { lr = min(lr, a[k] - r[k]); rr = max(rr, a[k] + r[k]); } } } VL dp(n), pref(n); REP(i, n) { for (int p : prze[i]) { dp[i] += 1L; if (p - 2 >= 0) dp[i] += pref[p - 2]; } if (dp[i] >= mod) dp[i] %= mod; dp[i] %= mod; pref[i] = dp[i]; if (i > 0) pref[i] += pref[i - 1]; if (pref[i] >= mod) pref[i] %= mod; } L wynik = 1; REP(i, n) wynik += dp[i]; wynik %= mod; cout << wynik; }
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 | #include <bits/stdc++.h> using namespace std; #define endl '\n' #define L long long #define MP make_pair #define REP(i, n) for(int i = 0; i < n; ++i) #define REPR(i, n) for(int i = n - 1; i >= 0; --i) #define FOR(i, a, b) for(int i = a; i < b; ++i) #define FORR(i, a, b) for(int i = b - 1; i >= a; --i) #define EB emplace_back #define ST first #define ND second #define S size() #define RS resize using VI = vector<int>; using VVI = vector<VI>; using PI = pair<int, int>; using VPI = vector<PI>; using VVPI = vector<VPI>; using VL = vector<L>; using VVL = vector<VL>; using VB = vector<bool>; using VC = vector<char>; int main() { ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); L mod = 1e9 + 7; int n; cin >> n; VL a(n), r(n); REP(i, n) cin >> a[i] >> r[i]; VVI prze(n); REP(i, n) { int k = i; L lr = a[i] - r[i], rr = a[i] + r[i]; while (k < n && (i == 0 || a[i - 1] < lr)) { if (k == n - 1 || a[k + 1] > rr) prze[k].EB(i); k++; if (k != n) { lr = min(lr, a[k] - r[k]); rr = max(rr, a[k] + r[k]); } } } VL dp(n), pref(n); REP(i, n) { for (int p : prze[i]) { dp[i] += 1L; if (p - 2 >= 0) dp[i] += pref[p - 2]; } if (dp[i] >= mod) dp[i] %= mod; dp[i] %= mod; pref[i] = dp[i]; if (i > 0) pref[i] += pref[i - 1]; if (pref[i] >= mod) pref[i] %= mod; } L wynik = 1; REP(i, n) wynik += dp[i]; wynik %= mod; cout << wynik; } |