#include <bits/stdc++.h> #define FOR(i, n) for(int i = 0; i < (n); ++i) #define REP(i, a, b) for(int i = (a); i < (b); ++i) #define TRAV(i, a) for(auto & i : (a)) #define SZ(x) ((int)(x).size()) #define PR std::pair #define MP std::make_pair #define X first #define Y second typedef long long ll; typedef std::pair<int, int> PII; typedef std::pair<ll, ll> PLL; typedef std::vector<int> VI; const int MOD = 1000000007; inline int DD(int a, int b){ return (a + b >= MOD ? a + b - MOD : a + b); } inline int OD(int a, int b){ return (a - b < 0 ? a - b + MOD : a - b); } struct BIT{ std::vector<int> t; inline int LSB(int a){ return a&(-a); } BIT(){} BIT(int sz){ t.resize(sz+1); } void add(int x, int val){ x++; while(x < (int)t.size()) t[x] = DD(t[x], val), x += LSB(x); } int query(int x){ x++; int r = 0; while(x > 0) r = DD(r, t[x]), x -= LSB(x); return r; } int query(int a, int b){ return OD(query(b), (a == 0 ? 0 : query(a-1))); } }; int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(0); int n; std::cin >> n; std::vector<PLL> B(n); std::vector<ll> vals; FOR(i, n){ ll a, r; std::cin >> a >> r; B[i] = MP(a, r); vals.push_back(a); } std::sort(vals.begin(), vals.end()); auto after = [&](ll a){ return static_cast<int>(std::lower_bound(vals.begin(), vals.end(), a) - vals.begin()); }; auto before = [&](ll a){ return static_cast<int>(std::upper_bound(vals.begin(), vals.end(), a) - vals.begin())-1; }; std::vector<PII> A(n+1, MP(-1, -1)); TRAV(i, B){ A[after(i.X)+1] = MP(after(i.X-i.Y)+1, before(i.X+i.Y)+1); } std::vector<int> dp(n+1); std::vector<bool> can(n+1, true); std::multiset<int, std::greater<int>> border; std::set<int> mam; mam.insert(0); border.insert(0); std::vector<std::list<int>> remove(n+2); BIT bit(n+5); dp[0] = 1; bit.add(0, dp[0]); REP(i, 1, n+1){ TRAV(j, remove[i]) border.erase(border.find(j)); dp[i] = bit.query(*border.begin(), i-1); auto it = mam.lower_bound(A[i].X); while(it != mam.end() && *it < i){ auto nxt = std::next(it); bit.add(*it, (MOD - bit.query(*it, *it))%MOD); mam.erase(it); it = nxt; } border.insert(i); mam.insert(i); remove[A[i].Y+1].push_back(i); bit.add(i, dp[i]); } std::cout << bit.query(0, n) << "\n"; 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> #define FOR(i, n) for(int i = 0; i < (n); ++i) #define REP(i, a, b) for(int i = (a); i < (b); ++i) #define TRAV(i, a) for(auto & i : (a)) #define SZ(x) ((int)(x).size()) #define PR std::pair #define MP std::make_pair #define X first #define Y second typedef long long ll; typedef std::pair<int, int> PII; typedef std::pair<ll, ll> PLL; typedef std::vector<int> VI; const int MOD = 1000000007; inline int DD(int a, int b){ return (a + b >= MOD ? a + b - MOD : a + b); } inline int OD(int a, int b){ return (a - b < 0 ? a - b + MOD : a - b); } struct BIT{ std::vector<int> t; inline int LSB(int a){ return a&(-a); } BIT(){} BIT(int sz){ t.resize(sz+1); } void add(int x, int val){ x++; while(x < (int)t.size()) t[x] = DD(t[x], val), x += LSB(x); } int query(int x){ x++; int r = 0; while(x > 0) r = DD(r, t[x]), x -= LSB(x); return r; } int query(int a, int b){ return OD(query(b), (a == 0 ? 0 : query(a-1))); } }; int main(){ std::ios_base::sync_with_stdio(false); std::cin.tie(0); int n; std::cin >> n; std::vector<PLL> B(n); std::vector<ll> vals; FOR(i, n){ ll a, r; std::cin >> a >> r; B[i] = MP(a, r); vals.push_back(a); } std::sort(vals.begin(), vals.end()); auto after = [&](ll a){ return static_cast<int>(std::lower_bound(vals.begin(), vals.end(), a) - vals.begin()); }; auto before = [&](ll a){ return static_cast<int>(std::upper_bound(vals.begin(), vals.end(), a) - vals.begin())-1; }; std::vector<PII> A(n+1, MP(-1, -1)); TRAV(i, B){ A[after(i.X)+1] = MP(after(i.X-i.Y)+1, before(i.X+i.Y)+1); } std::vector<int> dp(n+1); std::vector<bool> can(n+1, true); std::multiset<int, std::greater<int>> border; std::set<int> mam; mam.insert(0); border.insert(0); std::vector<std::list<int>> remove(n+2); BIT bit(n+5); dp[0] = 1; bit.add(0, dp[0]); REP(i, 1, n+1){ TRAV(j, remove[i]) border.erase(border.find(j)); dp[i] = bit.query(*border.begin(), i-1); auto it = mam.lower_bound(A[i].X); while(it != mam.end() && *it < i){ auto nxt = std::next(it); bit.add(*it, (MOD - bit.query(*it, *it))%MOD); mam.erase(it); it = nxt; } border.insert(i); mam.insert(i); remove[A[i].Y+1].push_back(i); bit.add(i, dp[i]); } std::cout << bit.query(0, n) << "\n"; return 0; } |