給出乙個長度為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)。
輸出格式:
輸出檔案median.out包含(n + 1) / 2行,第i行為a[1], a[3], …, a[2i – 1]的中位數。
輸入樣例#1:
71 3 5 7 9 11 6
輸出樣例#1:
1356
對於20%的資料,n ≤ 100;
對於40%的資料,n ≤ 3000;
對於100%的資料,n ≤ 100000.
看到是中位數,一開始想用線段樹做,結果發現一點都不好處理.
於是看到別人的思路,蠻巧妙的.
1) 首先,既然是中位數,我們想一想,可不可以在維護的時候把它們這些元素就分成兩半呢?
一半存小一點的,一半存大一點的.
2) 既然是要這樣存數,那麼我們可以直接用乙個大根堆和乙個小根堆來維護.
3) 然後還有就是,我們需要保證這兩個堆的元素個數相差1,這樣直接讓元素多的那個堆的堆頂輸出即可.
然後我直接用的stl 裡面的堆.
#includeusingnamespace
std;
const
int maxn=100008
;int
c[maxn],n;
priority_queue
>q2;
priority_queue
,greater >q1;
intmain()
//最後每次要保證輸出q2的top,讓操作更加簡單.
cout}
return0;
}
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...
堆 P1168 中位數
記錄乙個變數 mid 我們知道中位數是大小處於中間位置的數,所以建立兩個堆,乙個大根堆,乙個小根堆,大根堆存 mid 的數,小根堆存 mid 的數。所以我們每次向堆中加入元素時,就通過比較和 mid 的大小關係,選擇加入大根堆或者小根堆,但我們在輸出答案前需要對 mid 進行調整。如果大根堆和小根堆...