提交时间:2024-11-03 16:00:28

运行 ID: 34147

// #define USE_VECTOR #include <algorithm> #include <cstdlib> #include <iostream> #include <vector> #define lg __lg using namespace std; using i64 = long long; constexpr int INF = 0x7f7f7f7f, N = 5e5; struct Max { inline int operator()(int a, int b) const { return a > b ? a : b; }; }; struct Min { inline int operator()(int a, int b) const { return a < b ? a : b; }; }; template <class Op> struct SparseTable { int len, jmp; Op op; #ifdef USE_VECTOR vector<vector<int>> table; #else int table[lg(N) + 2][N + 5]; #endif SparseTable(const vector<int>& arr) : len(arr.size()) , jmp(lg(len) + 2) #ifdef USE_VECTOR , table(jmp) #endif { #ifdef USE_VECTOR table[0] = arr; #else for (int i = 0; i < len; ++i) table[0][i] = arr[i]; #endif for (int i = 1; i < jmp; ++i) { #ifdef USE_VECTOR table[i].resize(len); #endif for (int j = 0; j + (1 << (i - 1)) < len; ++j) table[i][j] = op(table[i - 1][j], table[i - 1][j + (1 << (i - 1))]); } } int query(int l, int r) const { int k = lg(r - l + 1); return op(table[k][l], table[k][r - (1 << k) + 1]); } }; struct Solution { template <class Mx, class Mn> bool check(const SparseTable<Mx>& mx, const SparseTable<Mn>& mn, int len, int diff, int k, int n) { int cnt = 0; for (int i = 0; i + len - 1 < n && cnt < k; ++i) { int curr = mx.query(i, i + len - 1) - mn.query(i, i + len - 1); cnt += (int)(curr >= diff); } return cnt >= k; } void solve() { int n, k; cin >> n >> k; vector<int> arr(n); for (int& x : arr) cin >> x; int len = n - k + 1, diff = INF; SparseTable<Max> mx(arr); SparseTable<Min> mn(arr); for (int i = 0; i + len - 1 < n; ++i) { int curr = mx.query(i, i + len - 1) - mn.query(i, i + len - 1); diff = min(diff, curr); } int l = 1, r = n - k + 1; while (l < r) { int mid = (l + r) >> 1; if (check(mx, mn, mid, diff, k, n)) r = mid; else l = mid + 1; } cout << diff << ' ' << l << '\n'; } }; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int t; cin >> t; while (t-- > 0) Solution().solve(); return 0; }