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 <bits/stdc++.h> #define LL long long using namespace std; const int Maxn = 100000 + 100, Mod = 1e9 + 7; int N; LL A, B; LL S[Maxn]; int Sum1[Maxn], Sum2[Maxn]; int Cnt1, Cnt2, Vis1[Maxn * 10], Vis2[Maxn * 10];
inline int lowbit (int x) {return x & (-x);}
inline void Update1 (int x, LL d) { ++x; while (x <= (N + 1)) { (Sum1[x] += d) %= Mod; Vis1[++Cnt1] = x; x += lowbit(x); } }
inline void Update2 (int x, int d) { ++x; while (x <= (N + 1)) { (Sum2[x] += d) %= Mod; Vis2[++Cnt2] = x; x += lowbit(x); } }
inline int Query1 (int x) { int Ans = 0; ++x; while (x) { (Ans += Sum1[x]) %= Mod; x -= lowbit(x); } return Ans; }
inline int Query2 (int x) { int Ans = 0; ++x; while (x) { (Ans += Sum2[x]) %= Mod; x -= lowbit(x); } return Ans; }
int main() { #ifdef hk_cnyali freopen("C.in", "r", stdin); freopen("C.out", "w", stdout); #endif scanf("%d%lld%lld", &N, &A, &B); for (int i = 1; i <= N; ++i) scanf("%lld", &S[i]); S[0] = -0x3f3f3f3f3f3f3f3f; Update1(0, 1); Update2(0, 1); for (int i = 1; i < N; ++i) { int l = 0, r = i, Ans1 = 0, Ans2 = 0; while (l <= r) { int mid = (l + r) >> 1; if (S[mid] <= S[i + 1] - B) l = mid + 1, Ans1 = mid; else r = mid - 1; } l = 0, r = i; while (l <= r) { int mid = (l + r) >> 1; if (S[mid] <= S[i + 1] - A) l = mid + 1, Ans2 = mid; else r = mid - 1; } int SUM1 = Query1(Ans1); int SUM2 = Query2(Ans2); if (S[i + 1] - S[i] < A) while (Cnt1) Sum1[Vis1[Cnt1--]] = 0; if (S[i + 1] - S[i] < B) while (Cnt2) Sum2[Vis2[Cnt2--]] = 0; Update2(i, SUM1); Update1(i, SUM2); } printf("%d\n", (Query1(N) + Query2(N)) % Mod); return 0; }
|