Poj3784(對頂堆維護中位數)

2022-09-01 13:57:21 字數 725 閱讀 7658

建立乙個大根堆與小根堆,大根堆中存(n+1)/2 的元素,中位數即為大根堆堆頂

用乙個從大到小排序的優先佇列q1來模擬小於x的數。

從小到大排序的優先佇列q2來模擬大於x的數。

動態維護兩個優先佇列的元素個數。q1.size()=q2.size() 輸入的數為偶數個時,

q1.size()=q2.size()+1 輸入的數為奇數個時。

每次要輸出的中位數恰好是q1.top().

#include#include

#include

#include

#include

using

namespace

std;

const

int maxn=10000

;priority_queue

q1;priority_queue

,greater >q2;

inta[maxn];

intmain()

while(q1.size()-1>q2.size())

if((i>>0)&1) a[++top]=q1.top();

}printf(

"%d %d\n

",cas,top);

for (int i=1;i<=top;i++)

if(top%10) printf("\n"

); }

return0;

}

10 16 對頂堆演算法研究(POJ 3784)

考慮維護兩個堆 乙個堆是大根堆,儲存1 x的元素 乙個堆是小根堆,儲存x 1 n的元素 對於乙個加入的元素y,考慮將其加入大根堆or小根堆?如果y mid,那麼將其加入小根堆 上面的堆 如果y include include include using namespace std int t,pos...

題解 poj3784 對頂堆演算法 排序 優先佇列

題目鏈結 對頂堆演算法 序列中從小到大排名為1 m 2的整數儲存到大根堆中,序列中從小到大排名m 2 1 m的整數儲存在小根堆中,小根堆堆頂就是序列中位數 include include include include using namespace std define rep i,a,b for...

雙堆維護中位數

1,先把第乙個數賦給mid 2,後來的數如果 mid就插入到小頂堆 mid就插入到大頂堆 3,每次插入新的值後都保證小頂堆的大小與大頂堆相等或大1 4,最後的中位數就是mid n為奇數 或者mid和小頂堆的堆頂元素的平均 priority queue,greater smallseq priorit...