Loading

二分中位数模板

二分中位数

在一个序列中,小于等于 \(x\) 的元素个数如果大于等于 \(\frac{n+1}{2}\),那么中位数一定小于等于 \(x\)

Check 的判出条件为小于等于 \(x\) 的元素个数。

const int N = 1e5 + 32;
ll n;
ll a[N];

bool Check(ll x)
{
    ll cnt = 0, en = (n + 1) / 2;
    fr(i, 1, n)
    {
        if (a[i] <= x) ++cnt;
        if (cnt >= en) return 1;
    }
    return 0;
}

int main()
{
    n = re;
    fr(i, 1, n) a[i] = re;

    ll l = 0, r = 1e9;
    while (l < r)
    {
        ll mid = (l + r) >> 1;
        if (Check(mid)) r = mid;
        else l = mid + 1;
    }
    W(r, '\n');
    return 0;
}
/*
输入
4
1 2 3 4
输出:2

输入
5
1 2 3 4 5
输出:3
*/
posted @ 2024-10-10 18:48  EdisonBa  阅读(7)  评论(0编辑  收藏  举报