記錄乙個變數$mid$,我們知道中位數是大小處於中間位置的數,所以建立兩個堆,乙個大根堆,乙個小根堆,大根堆存≤ $mid$的數,小根堆存》$mid$的數。所以我們每次向堆中加入元素時,就通過比較和$mid$的大小關係,選擇加入大根堆或者小根堆,但我們在輸出答案前需要對$mid$進行調整。如果大根堆和小根堆內的元素個數相同,就無需處理,此時$mid$已然是當前的中位數。如果兩個堆中元素個數不同,就需要取個數多的乙個堆的堆頂,與$mid$取平均值
1 #include 2 #include 3 #include 4 #include 5using
namespace
std;
6intn;7
int a[100000];8
intmid;
9 priority_queue ,less >q1;
10 priority_queue ,greater >q2;
11int
main()
1231
else36}
37 cout39}
40return0;
41 }
洛谷P1168 中位數(堆)
題目描述 給出乙個長度為n的非負整數序列a i 對於所有1 k n 1 2,輸出a 1 a 3 a 2k 1 的中位數。即前1,3,5,個數的中位數。輸入輸出格式 輸入格式 輸入檔案median.in的第1行為乙個正整數n,表示了序列長度。第2行包含n個非負整數a i a i 10 9 輸出格式 輸...
P1168 中位數 題解
csdn同步 原題鏈結 簡要題意 給定乙個長度為 n 的序列 a 求 a 1 a x 的中位數。1 leq x leq n 且 x 為奇數 附註 中位數的定義 排序後位於最中間的數。如果長度為偶數則是最中間兩個數的平均值。n leq 10 5 a i leq 10 9 這個題水不水,就看你怎麼考慮了...
題解 P1168 中位數
看了此題,發現是求中位數,自然而然的想到了求kth 求kth有多種,我用的是權值線段樹,即記錄x的個數,但,我們看題,發現a i 可以高達1e9,乙個陣列是開不完的,不過萬幸的是n只到了1e5,而求kth只需要知道大小關係就行,不需要知道具體的值,所以,我們可以用離散化來搞定它!這裡說一下stabl...