#include <bits/stdc++.h>
#define FOR(i, b, e) for (int i = (b); i <= (e); i++)
#define FORD(i, b, e) for (int i = (e); i >= (b); i--)
#define MP make_pair
#define FS first
#define ND second
#define PB push_back
#define ALL(x) x.begin(), x.end()
using namespace std;
using LL = long long;
using PII = pair<int,int>;
using PLL = pair<LL,LL>;
using VI = vector<int>;
using VLL = vector<LL>;
template<class T>
using V = vector<T>;
template<class T>
int sz(const T& a) { return (int)a.size(); }
template<class T>
void amin(T& a, T b) { a = min(a, b); }
template<class T>
void amax(T& a, T b) { a = max(a, b); }
const int inf = 1e9;
const LL infl = 1e18;
const int N = 300000;
const int mod = int(1e9) + 7;
int n, ans = 1;
LL a[N + 1], r[N + 1];
VI g[N + 1], gr[N + 1];
bool used[N + 1];
VI order;
int c[N + 1], f;
VI comps[N + 1];
void dfs1(int v) {
used[v] = true;
for (int x : g[v]) if (!used[x]) dfs1(x);
order.PB(v);
}
void dfs2(int v) {
used[v] = true;
c[v] = f;
comps[f].PB(v);
for (int x : gr[v]) if (!used[x]) dfs2(x);
}
PLL seg[N + 1], range[N + 1];
int dp[N + 1];
int main() {
scanf("%d", &n);
FOR(i, 1, n) scanf("%lld %lld", &a[i], &r[i]);
FOR(i, 1, n) FOR(j, 1, n) {
if (i != j && a[i] - r[i] <= a[j] && a[j] <= a[i] + r[i]) {
//printf("%d -> %d\n", i, j);
g[i].push_back(j);
gr[j].push_back(i);
}
}
FOR(i, 1, n) if (!used[i]) dfs1(i);
fill(used, used + n + 1, false);
FOR(i, 1, n) {
int v = order[n-i];
if (!used[v]) {
++f;
dfs2(v);
}
}
FORD(i, 1, f) {
seg[i].FS = infl;
seg[i].ND = -infl;
range[i].FS = infl;
range[i].ND = -infl;
for (int x : comps[i]) {
amin(seg[i].FS, a[x]);
amax(seg[i].ND, a[x]);
amin(range[i].FS, a[x] - r[x]);
amax(range[i].ND, a[x] + r[x]);
for (int y : g[x]) {
amin(range[i].FS, range[c[y]].FS);
amax(range[i].ND, range[c[y]].ND);
}
}
}
order.clear();
order.resize(f);
iota(ALL(order), 1);
sort(ALL(order), [](int i, int j) {
return seg[i].ND < seg[j].ND;
});
/*
for (int i : order) {
printf("%lld %lld %lld %lld\n", range[i].FS, seg[i].FS, seg[i].ND, range[i].ND);
}
*/
FOR(i, 0, f - 1) {
int x = order[i];
dp[x] = 1;
FOR(j, 0, i - 1) {
int y = order[j];
if (seg[y].ND < range[x].FS && range[y].ND < seg[x].FS) {
dp[x] = (1LL * dp[x] + dp[y]) % mod;
}
}
ans = (1LL * ans + dp[x]) % mod;
}
printf("%d\n", ans);
}
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 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 | #include <bits/stdc++.h> #define FOR(i, b, e) for (int i = (b); i <= (e); i++) #define FORD(i, b, e) for (int i = (e); i >= (b); i--) #define MP make_pair #define FS first #define ND second #define PB push_back #define ALL(x) x.begin(), x.end() using namespace std; using LL = long long; using PII = pair<int,int>; using PLL = pair<LL,LL>; using VI = vector<int>; using VLL = vector<LL>; template<class T> using V = vector<T>; template<class T> int sz(const T& a) { return (int)a.size(); } template<class T> void amin(T& a, T b) { a = min(a, b); } template<class T> void amax(T& a, T b) { a = max(a, b); } const int inf = 1e9; const LL infl = 1e18; const int N = 300000; const int mod = int(1e9) + 7; int n, ans = 1; LL a[N + 1], r[N + 1]; VI g[N + 1], gr[N + 1]; bool used[N + 1]; VI order; int c[N + 1], f; VI comps[N + 1]; void dfs1(int v) { used[v] = true; for (int x : g[v]) if (!used[x]) dfs1(x); order.PB(v); } void dfs2(int v) { used[v] = true; c[v] = f; comps[f].PB(v); for (int x : gr[v]) if (!used[x]) dfs2(x); } PLL seg[N + 1], range[N + 1]; int dp[N + 1]; int main() { scanf("%d", &n); FOR(i, 1, n) scanf("%lld %lld", &a[i], &r[i]); FOR(i, 1, n) FOR(j, 1, n) { if (i != j && a[i] - r[i] <= a[j] && a[j] <= a[i] + r[i]) { //printf("%d -> %d\n", i, j); g[i].push_back(j); gr[j].push_back(i); } } FOR(i, 1, n) if (!used[i]) dfs1(i); fill(used, used + n + 1, false); FOR(i, 1, n) { int v = order[n-i]; if (!used[v]) { ++f; dfs2(v); } } FORD(i, 1, f) { seg[i].FS = infl; seg[i].ND = -infl; range[i].FS = infl; range[i].ND = -infl; for (int x : comps[i]) { amin(seg[i].FS, a[x]); amax(seg[i].ND, a[x]); amin(range[i].FS, a[x] - r[x]); amax(range[i].ND, a[x] + r[x]); for (int y : g[x]) { amin(range[i].FS, range[c[y]].FS); amax(range[i].ND, range[c[y]].ND); } } } order.clear(); order.resize(f); iota(ALL(order), 1); sort(ALL(order), [](int i, int j) { return seg[i].ND < seg[j].ND; }); /* for (int i : order) { printf("%lld %lld %lld %lld\n", range[i].FS, seg[i].FS, seg[i].ND, range[i].ND); } */ FOR(i, 0, f - 1) { int x = order[i]; dp[x] = 1; FOR(j, 0, i - 1) { int y = order[j]; if (seg[y].ND < range[x].FS && range[y].ND < seg[x].FS) { dp[x] = (1LL * dp[x] + dp[y]) % mod; } } ans = (1LL * ans + dp[x]) % mod; } printf("%d\n", ans); } |
English