P1168 中位數 題解

2022-02-14 15:59:11 字數 884 閱讀 3771

csdn同步

原題鏈結

簡要題意:

給定乙個長度為 \(n\) 的序列 \(a\),求 \(a_1\) ~ \(a_x\) 的中位數。(\(1 \leq x \leq n\) 且 \(x\) 為奇數)

附註:中位數的定義:排序後位於最中間的數。如果長度為偶數則是最中間兩個數的平均值

\(n \leq 10^5\) , \(a_i \leq 10^9\).

這個題水不水,就看你怎麼考慮了。

其實這個題不用高大上的資料結構,只需要模擬。

維護乙個容器 \(v\),逐漸加入 \(a\) 的元素,保證有序性。

每次都要加入乙個元素,這是插入排序的原理,即二分找到該元素的位置,然後插入。\(\mathcal(\log n)\).

但是我們需要選定的容器可以支援快速插入,顯然vector可以勝任,並且我們不用手寫二分,可以用upper_bound來實現。

時間複雜度:\(\mathcal(n \log n)\).

實際得分:\(100pts\).

#pragma gcc optimize(2)

#includeusing namespace std;

const int n=1e5+1;

inline int read()

int x=0;while(isdigit(ch)) x=x*10+ch-'0',ch=getchar(); return x*f;}

int n;

vectorv;

int main()

return 0;

}

題解 P1168 中位數

看了此題,發現是求中位數,自然而然的想到了求kth 求kth有多種,我用的是權值線段樹,即記錄x的個數,但,我們看題,發現a i 可以高達1e9,乙個陣列是開不完的,不過萬幸的是n只到了1e5,而求kth只需要知道大小關係就行,不需要知道具體的值,所以,我們可以用離散化來搞定它!這裡說一下stabl...

堆 P1168 中位數

記錄乙個變數 mid 我們知道中位數是大小處於中間位置的數,所以建立兩個堆,乙個大根堆,乙個小根堆,大根堆存 mid 的數,小根堆存 mid 的數。所以我們每次向堆中加入元素時,就通過比較和 mid 的大小關係,選擇加入大根堆或者小根堆,但我們在輸出答案前需要對 mid 進行調整。如果大根堆和小根堆...

洛谷 P1168 中位數

題目描述 給出乙個長度為n的非負整數序列a i 對於所有1 k n 1 2,輸出a 1 a 2 a 2k 1 的中位數。color red 即 color 前1,3,5,個數的中位數。輸入輸出格式 輸入格式 輸入檔案median.in的第1行為乙個正整數n,表示了序列長度。第2行包含n個非負整數a ...