我的代码:
#include <bits/stdc++.h>
using namespace std;
using Pii = pair<int, int>;
const int kMaxN = 2e5 + 5, kM = 30, kInf = -2e9 - 56;
int n, st[kMaxN][kM][4], k, lg[kMaxN], ans;
void I() {
for (int i = 2; i <= n; i++) {
lg[i] = lg[i / 2] + 1;
}
for (int len = 1; len < kM; len++) {
for (int i = 1; i + (1 << len) - 1 <= n; i++) {
st[i][len][0] = max(st[i][len - 1][0], st[i + (1 << len - 1)][len - 1][0]);
st[i][len][1] = min(st[i][len - 1][1], st[i + (1 << len - 1)][len - 1][1]);
}
}
}
Pii R(int l, int r) {
int len = lg[r - l + 1];
return {max(st[l][len][0], st[r - (1 << len) + 1][len][0]), min(st[l][len][1], st[r - (1 << len) + 1][len][1])};
}
bool C(int x) {
int sum = 0;
for (int i = 1; i + x - 1 <= n; i++) {
Pii e = R(i, i + x - 1);
sum += ((e.first - e.second) >= ans);
}
return (sum >= k);
}
int main() {
int t;
for (cin >> t, ans = -kInf; t >= 1; t--) {
memset(st, 0, sizeof(st)), cin >> n >> k;
for (int i = 1; i <= n; i++) {
cin >> st[i][0][0];
st[i][0][1] = st[i][0][0];
}
I();
for (int i = 1; i <= k; i++) {
Pii e = R(i, i + (n - k + 1) - 1);
ans = min(e.first - e.second, ans);
}
int l = 0, r = n - k + 2;
while (l + 1 < r) {
int m = l + r >> 1;
if (C(m)) {
r = m;
} else {
l = m;
}
}
cout << ans << ' ' << r << '\n';
}
return 0;
}