5pts 求调(悬 2 关)
查看原帖
5pts 求调(悬 2 关)
1449703
Ak_hjc_using楼主2025/1/12 21:45

我的代码:

#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;
}
2025/1/12 21:45
加载中...