#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5 + 5;
int a[N];
int n, k;
int qmin[N], qmax[N], h1, t1, h2, t2;
int mn;
bool check(int x, int ans) {
h1 = 1, t1 = 0, h2 = 1, t2 = 0;
for (int i = 1; i <= x; i++) {
while (h1 <= t1 && a[i] <= a[qmin[t1]]) t1--;
qmin[++t1] = i;
while (h2 <= t2 && a[i] >= a[qmax[t2]]) t2--;
qmax[++t2] = i;
}
bool flag = false;
mn = LONG_LONG_MAX;
if (a[qmax[h2]] - a[qmin[h1]] >= ans) mn = min(mn, a[qmax[h2]] - a[qmin[h1]]), flag = true;
for (int i = x + 1; i <= n; i++) {
while (h1 <= t1 && qmin[h1] <= i - x) h1++;
while (h1 <= t1 && a[i] <= a[qmin[t1]]) t1--;
qmin[++t1] = i;
while (h2 <= t2 && qmax[h2] <= i - x) h2++;
while (h2 <= t2 && a[i] >= a[qmax[t2]]) t2--;
qmax[++t2] = i;
if (a[qmax[h2]] - a[qmin[h1]] > ans) mn = min(mn, a[qmax[h2]] - a[qmin[h1]]), flag = true;
}
return flag;
}
signed main() {
int t;
cin >> t;
while (t--) {
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
int l = 1, r = n - k + 1;
int ans = LONG_LONG_MIN, len;
while (r - l > 5) {
int mid = (l + r) >> 1;
if (check(mid, ans)) {
ans = mn;
len = mid;
r = mid;
} else l = mid;
}
for (int i = r; i >= l; i--) {
if (check(i, ans)) {
ans = mn;
len = i;
}
}
cout << ans << " " << len << endl;
}
return 0;
}
大概思路就是用单调队列。
貌似思路是对的就是实现有点问题