Run ID | 作者 | 问题 | 语言 | 测评结果 | 分数 | 时间 | 内存 | 代码长度 | 提交时间 |
---|---|---|---|---|---|---|---|---|---|
34110 | 23级逯一鸣 | 【S】T1 | C++ | 内存超限 | 90 | 838 MS | 525156 KB | 2343 | 2024-11-03 15:04:31 |
#include <algorithm> #include <iostream> #include <vector> #define lg __lg using namespace std; using i64 = long long; constexpr int N = 5e5, INF = 0x7f7f7f7f; struct Max { int operator()(int a, int b) const { return a > b ? a : b; }; }; struct Min { int operator()(int a, int b) const { return a < b ? a : b; }; }; template <class Op> struct SparseTable { int len; Op op; vector<int> table[lg(N) + 2]; SparseTable(const vector<int>& arr) : len(arr.size()) { table[0] = arr; for (int i = 1; i < lg(N) + 2; ++i) { table[i].resize(len); 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(SparseTable<Mx>* const mx, SparseTable<Mn>* const 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; }