fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. typedef long long ll;
  5. typedef pair<int, int> ii;
  6.  
  7. const int INF = 1e9;
  8. const ll LINF = 1e18;
  9.  
  10. const int N = 2e5 + 5;
  11.  
  12. int n, k;
  13. int a[N];
  14. int pref[N];
  15.  
  16. // Giả sử ta cần kiểm tra một giá trị med (median) nào đấy
  17. // Ta có mảng b với b[i] = 1, nếu a[i] >= med
  18. // b[i] = -1, nếu a[i] < med
  19.  
  20. // Một đoạn [l, r] thoả mãn nếu số lượng (a[i] >= med) lớn hơn số lượng (a[i] < med)
  21. // => Tổng đoạn b[l..r] > 0
  22. // => Check max_sum(b) > 0
  23.  
  24. // Và với giá trị med càng lớn thì số số 1 càng giảm, số số -1 càng tăng
  25. // giá trị med càng nhỏ thì số số 1 càng tăng, số số -1 càng giảm
  26. // => Tìm kiếm nhị phân đáp án số median
  27.  
  28. bool check(int med) {
  29. // r - l >= k
  30. // l <= r - k
  31.  
  32. for (int i = 1; i <= n; i++) pref[i] = pref[i - 1] + (a[i] >= med ? 1 : -1);
  33.  
  34. int mx_sum = 0, mn_pref = INF;
  35. for (int r = 1, l = -1; r <= n; r++) {
  36. while (l + 1 <= r - k) {
  37. l++;
  38. mn_pref = min(mn_pref, pref[l]);
  39. }
  40. mx_sum = max(mx_sum, pref[r] - mn_pref);
  41. }
  42.  
  43. return (mx_sum > 0);
  44. }
  45.  
  46. int main() {
  47. ios::sync_with_stdio(0); cin.tie(0);
  48. cin >> n >> k;
  49. for (int i = 1; i <= n; i++) cin >> a[i];
  50.  
  51. int l = 1, r = n, ans = -1;
  52.  
  53. while (l <= r) {
  54. int mid = (l + r) >> 1;
  55.  
  56. if (check(mid)) {
  57. ans = mid;
  58. l = mid + 1;
  59. }
  60. else {
  61. r = mid - 1;
  62. }
  63. }
  64.  
  65. cout << ans << '\n';
  66. }
Success #stdin #stdout 0s 5280KB
stdin
5 3
1 2 3 2 1
stdout
2