对顶堆时间复杂度(
  • 板块P1168 中位数
  • 楼主Zlc晨鑫
  • 当前回复6
  • 已保存回复6
  • 发布时间2021/8/3 16:08
  • 上次更新2023/11/4 12:08:05
查看原帖
对顶堆时间复杂度(
297555
Zlc晨鑫楼主2021/8/3 16:08

所以对顶堆的时间复杂度是O(NlogN)吗?

怎么求出来的啊qwq

code:

#include <queue>
#include <cstdio>
#include <iostream>

using namespace std;

const int N = 1e5 + 10;

int a[N];
priority_queue<int> pq_max;
priority_queue<int, vector<int>, greater<int> > pq_min;

int main()
{
    int n, mid;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i)
    {
        scanf("%d", &a[i]);
        if (i & 1)
        {
            if (i == 1)
            {
                mid = a[i];
                printf("%d\n", a[1]);
            }
            else
            {
                int x = a[i - 1], y = a[i];
                if (x <= mid) pq_max.push(x);
                else pq_min.push(x);
                if (y <= mid) pq_max.push(y);
                else pq_min.push(y);
                // 更新中位数
                // 比中位数小(或等于)的数的个数小于比它大的数的个数
                while (pq_max.size() < pq_min.size())
                {
                    pq_max.push(mid);
                    mid = pq_min.top();
                    pq_min.pop();
                }
                // 反之亦然
                while (pq_max.size() > pq_min.size())
                {
                    pq_min.push(mid);
                    mid = pq_max.top();
                    pq_max.pop();
                }
                printf("%d\n", mid);
            }
        }
    }
    return 0;
}
2021/8/3 16:08
加载中...