[CF1486D] Max Median - 二分

Description

给定一个长度为 \(n\) 的序列 \(a\),求所有长度 \(\ge k\) 的连续子串中,中位数的最大值。定义中位数是一个长度为 \(x\) 的序列升序排序后的第 \(\left\lfloor\frac{x+1}{2}\right\rfloor\) 位的值。

Solution

考虑二分一个值,检验中位数是否可能大于等于这个值,如何检验

我们将小于 mid 的变成 -1,其余的变成 1

这样如果最终序列有一个子串的和 > 0,就意味着这个值是可以的

#include <bits/stdc++.h>
using namespace std;

#define int long long

signed main()
{
    ios::sync_with_stdio(false);

    int n, k;
    cin >> n >> k;

    vector<int> a(n + 2);
    for (int i = 1; i <= n; i++)
        cin >> a[i];

    int l = 0, r = n, ans = 0;

    while (l <= r)
    {
        int mid = (l + r) / 2;
        vector<int> b(n + 2);
        for (int i = 1; i <= n; i++)
        {
            if (a[i] < mid)
                b[i] = -1;
            else
                b[i] = 1;
        }
        for (int i = 1; i <= n; i++)
            b[i] += b[i - 1];
        int mx = 0;
        int flag = 0;
        for (int i = k; i <= n; i++)
        {
            if (b[i] > mx)
                flag = 1;
            mx = min(mx, b[i - k + 1]);
        }
        if (flag)
            l = mid + 1, ans = mid;
        else
            r = mid - 1;
    }

    cout << ans << endl;
}

相关文章:

  • 2021-06-19
  • 2022-12-23
  • 2021-06-06
  • 2021-07-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-11-24
猜你喜欢
  • 2022-12-23
  • 2021-09-28
  • 2022-12-23
  • 2021-12-15
  • 2021-06-05
  • 2021-05-04
  • 2021-09-02
相关资源
相似解决方案