提交时间:2024-11-03 13:30:40

运行 ID: 34039

#include <bits/stdc++.h> #define int long long using namespace std; int n, k; int a[500005], stx[20][500005], stn[20][500005]; inline int qx(int l, int r) { int x = __lg(r - l + 1); return max(stx[x][l], stx[x][r - (1 << x) + 1]); } inline int qn(int l, int r) { int x = __lg(r - l + 1); return min(stn[x][l], stn[x][r - (1 << x) + 1]); } inline bool check(int l, int x) { int cnt = 0; for (int i = 1; i <= n - l + 1; i++) { if (qx(i, i + l - 1) - qn(i, i + l - 1) >= x) cnt++; } return cnt >= k; } // #define getchar getchar_unlocked inline int read() { int x = 0; bool fl = 0; char c = getchar(); while (c < '0' || c > '9') { if (c == '-') fl = 1; c = getchar(); } while (c >= '0' && c <= '9') { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); } return fl ? -x : x; } signed main() { //freopen("choose.in", "r", stdin); //freopen("choose.out", "w", stdout); int _ = read(); while (_--) { n = read(), k = read(); for (int i = 1; i <= n; i++) { a[i] = read(); stx[0][i] = a[i]; stn[0][i] = a[i]; } int L = __lg(n); for (int i = 1; i <= L; i++) { for (int j = 1; j <= n; j++) { stx[i][j] = max(stx[i - 1][j], stx[i - 1][j + (1 << i - 1)]); stn[i][j] = min(stn[i - 1][j], stn[i - 1][j + (1 << i - 1)]); } } // check(114, 514); int mx, mn; int ans1 = 0x3f3f3f3f3f3f3f3f; for (int l = 1, r = n - k + 1; r <= n; l++, r++) { mx = qx(l, r), mn = qn(l, r); // printf("[%lld, %lld] min:%lld max:%lld\n", l, r, mn, mx); ans1 = min(ans1, mx - mn); } int l = 1, r = n - k + 1; while (l < r) { int mid = (l + r >> 1); if (check(mid, ans1)) { r = mid; } else l = mid + 1; } printf("%lld %lld\n", ans1, l); } return 0; } // 锟斤拷锟斤拷锟?