#55258: cpp_answer


yp11451202@yphs.tp.edu.tw (705-38黃鈺潤)


#include <iostream>
#include <vector>

using namespace std;

typedef long long ll;

void solve() {
    int n;
    ll k;
    if (!(cin >> n >> k)) return;

    vector<ll> a(n);
    vector<ll> w(n);
    for (int i = 0; i < n; ++i) cin >> a[i];
    for (int i = 0; i < n; ++i) cin >> w[i];

    vector<ll> prefix_w(n + 1, 0);
    for (int i = 0; i < n; ++i) {
        prefix_w[i + 1] = prefix_w[i] + w[i];
    }

    ll S = 0;
    int j = 0; // 指向滿足 a[i] - a[j] > k 的最大邊界
    for (int i = 0; i < n; ++i) {
        // 當距離大於 k 時,j 向右移
        while (j < i && a[i] - a[j] > k) {
            j++;
        }
        // 此時 0 到 j-1 的所有點都與 i 滿足距離 > k
        if (j > 0) {
            S += w[i] * prefix_w[j];
        }
    }

    cout << S << endl;
}

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int t;
    if (!(cin >> t)) return 0;
    while (t--) {
        solve();
    }
    return 0;
}