zoukankan      html  css  js  c++  java
  • [CF1486D] Max Median

    [CF1486D] Max Median - 二分

    Description

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

    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;
    }
    
  • 相关阅读:
    HackerRank
    HackerRank
    HackerRank
    LeetCode "Bitwise AND of Numbers Range"
    HackerRank
    HackerRank
    LeetCode "Binary Tree Right Side View"
    HihoCoder
    HihoCoder
    HackerRank
  • 原文地址:https://www.cnblogs.com/mollnn/p/14436619.html
Copyright © 2011-2022 走看看