All pastes #9h9yved5TN Raw Edit

cpp paste

public cpp v1 · immutable
·published 2026-11-08 10:49 UTC
rendered paste body
#include <bits/stdc++.h>using i64 = long long;void Solve() {    int n;    i64 d;    std::cin >> n >> d;    std::vector<i64> x(n);    for (int i = 0; i < n; i++) {        std::cin >> x[i];    }    std::vector<int> right(n, -1);    for (int i = n - 1, j = n - 1; i >= 0; i--) {        while (j > i && x[j] - x[i] > d) {            j--;        }        right[i] = j;    }    std::vector<int> g(n, n);    std::vector<int> left(n, n);    for (int i = 0, j = 0; i < n; i++) {        while (j < i && x[i] - x[j] > d) {            j++;        }                g[j] = std::min(g[j], i);        left[i] = j;    }    constexpr int A = 3, B = 3, V = 2;    constexpr int STRIDE_A = B * V;        // 6    constexpr int STRIDE_B = V;            // 2    constexpr int STRIDE_I = A * B * V;    // 18    std::vector<int> f(n * STRIDE_I);    auto F = [&](int i, int a, int b, int v) -> int& {        return f[i * STRIDE_I + (a - 1) * STRIDE_A + (b - 1) * STRIDE_B + (v - 1)];    };    for (int i = n - 1; i >= 1; i--) {        if (right[i] == i) {            continue;        }        int j = right[i];        if (j == i) {            continue;        }        for (int a = 1; a <= 3; a++) {            for (int b = 1; b <= 3; b++) {                if (j == i + 1) {                    int c = std::min(3, left[j] == i ? b : left[j] == i - 1 ? a + b : 3);                    F(i, a, b, 1) += F(j, 1, c, 1);                     F(i, a, b, 2) += F(j, 1, c, 2);                     if (c <= 2) {                        F(i, a, b, c) += 1;                    }                    continue;                }                int p1 = std::max(i + 1, g[i - 1]), p2 = std::min(j + 1, g[i]);                                    if (b <= 2) {                    F(i, a, b, b) += j - p2 + 1;                }                                if (a + b <= 2) {                    F(i, a, b, a + b) += std::max(0, p2 - p1);                }                int c = std::min(3, left[j - 1] < i - 1 ? 3 : left[j - 1] == i - 1 ? a + b : b);                int d = std::min(3, left[j] < i - 1 ? 3 : left[j] == i - 1 ? a + b : b);                F(i, a, b, 1) += F(j, c, d, 1);                F(i, a, b, 2) += F(j, c, d, 2);            }        }    }    i64 ans = 0, lst = 0;    for (int i = n - 1; i >= 0; i--) {        if (right[i] == i) {            lst = 0;            continue;        }        if (right[i] == i + 1) {            ans += lst;            continue;        }        lst = F(right[i], 1, 1, 2);        ans += lst;       // std::cout << lst << " ";    }   // std::cout << "\n";    std::cout << ans << '\n'; }  int main() {    std::ios::sync_with_stdio(false);    std::cin.tie(0);    int c, t;    std::cin >> c >> t;    while (t --) {        Solve();    }    return 0;}