建立乙個大根堆與小根堆,大根堆中存(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...