#include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> using namespace std; int M = 1000000007; template <typename IntType> IntType add(IntType a, IntType b, IntType c) { //assert(c > 0 && 0 <= a && a < c && 0 <= b && b < c); IntType room = (c - 1) - a; if (b <= room) a += b; else a = b - room - 1; return a; } template <typename IntType> IntType mod(IntType a, IntType c) { //assert(c > 0); IntType q = a / c; // q may be negative a -= q * c; // now -c < a && a < c if (a < 0) a += c; return a; } template <typename IntType> IntType multiplyModulo(IntType a, IntType b, IntType c) { IntType result = 0; a = mod(a, c); b = mod(b, c); if (b > a) std::swap(a, b); while (b) { if (b & 0x1) result = add(result, a, c); a = add(a, a, c); b >>= 1; } return result; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int pl = 0, pr = 0, ll = 0, lr = 0; int a,r; cin >> a >> r; ll = a; lr = r; int tot = 1; for (int i=1;i<n;i++) { int a,r; cin >> a >> r; if (ll+lr>=a && a-r<=ll) { //cout << "ll=" << ll << " lr=" << lr << " a=" << a << " r=" << r << "\n"; //cout << "skip same " << a << "\n"; } else if (ll+lr >=a) { if (pl == 0) pl = 2; else pl = (2*pl) % M; //cout << "pl=" << pl << "\n"; } else if (a-r<=ll) { if (pr == 0) pr = 2; else pr = (2*pr) % M; //cout << "pr=" << pr << "\n"; } else { int v = (pr + pl + 1) % M; tot = multiplyModulo(tot, v, M); pl = 0; pr = 0; } ll = a; lr = r; } int v = (pr + pl + 1) % M; tot = multiplyModulo(tot, v, M); // for (auto &x : kolizje) { // cout << x.first << " "; // for (auto &y : x.second) { // cout << y << " "; // } // cout << '\n'; // } int res = 7; cout << tot << '\n'; }
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 98 99 100 101 102 103 | #include <iostream> #include <algorithm> #include <vector> #include <set> #include <map> using namespace std; int M = 1000000007; template <typename IntType> IntType add(IntType a, IntType b, IntType c) { //assert(c > 0 && 0 <= a && a < c && 0 <= b && b < c); IntType room = (c - 1) - a; if (b <= room) a += b; else a = b - room - 1; return a; } template <typename IntType> IntType mod(IntType a, IntType c) { //assert(c > 0); IntType q = a / c; // q may be negative a -= q * c; // now -c < a && a < c if (a < 0) a += c; return a; } template <typename IntType> IntType multiplyModulo(IntType a, IntType b, IntType c) { IntType result = 0; a = mod(a, c); b = mod(b, c); if (b > a) std::swap(a, b); while (b) { if (b & 0x1) result = add(result, a, c); a = add(a, a, c); b >>= 1; } return result; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int n; cin >> n; int pl = 0, pr = 0, ll = 0, lr = 0; int a,r; cin >> a >> r; ll = a; lr = r; int tot = 1; for (int i=1;i<n;i++) { int a,r; cin >> a >> r; if (ll+lr>=a && a-r<=ll) { //cout << "ll=" << ll << " lr=" << lr << " a=" << a << " r=" << r << "\n"; //cout << "skip same " << a << "\n"; } else if (ll+lr >=a) { if (pl == 0) pl = 2; else pl = (2*pl) % M; //cout << "pl=" << pl << "\n"; } else if (a-r<=ll) { if (pr == 0) pr = 2; else pr = (2*pr) % M; //cout << "pr=" << pr << "\n"; } else { int v = (pr + pl + 1) % M; tot = multiplyModulo(tot, v, M); pl = 0; pr = 0; } ll = a; lr = r; } int v = (pr + pl + 1) % M; tot = multiplyModulo(tot, v, M); // for (auto &x : kolizje) { // cout << x.first << " "; // for (auto &y : x.second) { // cout << y << " "; // } // cout << '\n'; // } int res = 7; cout << tot << '\n'; } |