Solution

一遍贪心的差分就够了,从开头往后插有三种情况: 代表a[i]处的差分前缀和

  1. 说明两者相等,无需操作。

  2. a.

    ​ 说明前方的数都要增加,那么显然

    b.

  3. a.

    ​ 说明后方的k个数都要增加$

    b.

Code

#include <bits/stdc++.h>

#define fi first
#define se second
#define mp make_pair
#define lowbit(x) ((x) & -(x))

using namespace std;
using ll = long long;
using ull = unsigned long long;
using pii = pair<int, int>;

constexpr double eps = 1e-8;
constexpr int NINF = 0xc0c0c0c0;
constexpr int INF = 0x3f3f3f3f;
constexpr ll mod = 1e9 + 7;
constexpr ll N = 1e6 + 5;

ll n, k, a[N], d[N];

void solve() {
    cin >> n >> k;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        d[i] = 0;
    }
    ll ans = 0, D1 = 0, D2 = 0;
    for (int i = 1; i < n; i++) {
        D1 += d[i];
        D2 = D1 + d[i + 1];
        a[i] += D1;
        if ((a[i] < a[i + 1] + D2 && (i < k || i % k)) || (a[i] > a[i + 1] + D2 && (i + k > n))) {
            ans = -1;
            break;
        }
        if (a[i] < a[i + 1] + D2) {
            ans += i / k * (a[i + 1] + D2 - a[i]);
        } else if (a[i] > a[i + 1] + D2) {
            ans += a[i] - a[i + 1] - D2;
            d[i + 1] += a[i] - a[i + 1] - D2;
            d[i + 1 + k] -= a[i] - a[i + 1] - D2;
        }
    }
    cout << ans << '\n';
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int T;
    cin >> T;
    while (T--) {
        solve();
    }

    return 0;
}