洛谷P1168中位數

2022-04-05 21:34:00 字數 960 閱讀 9638

傳送門啦

基本思想就是二分尋找答案,然後用樹狀陣列去維護有幾個比這個二分出來的值大,然後就沒有了;

資料要離散,這個好像用map也可以,但是不會;

那怎麼離散呢?

我們先把a陣列讀入並複製給s陣列,然後排序a;

這個時候a陣列就有序了,我們就可以把s陣列裡的值通過二分找到其在a陣列裡的下標,這樣就把1~1e9的資料壓縮到1e5了;

這樣的離散支援去重,支援不去重;

離散後我們應該怎麼辦呢??

我們能用樹狀陣列來維護字首和;

那我們每增加乙個數,我們就把他當作下標,在上面+1;然後我統計小於等於x的個數時直接取x的字首和好了

#include #include #include #include using namespace std;

const int maxn = 100005;

inline int read()

while(ch >= '0' && ch <= '9')

return x * f;

}int n,a[maxn],tot;

int bit[maxn],s[maxn];

inline int lowbit(int x)

inline void add(int x,int y)

inline int query(int k)

return ans + 1;

}int main()

sort(a + 1 , a + 1 + n);

tot = unique(a + 1 , a + 1 + tot) - a - 1;

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

s[i] = lower_bound(a + 1 , a + 1 + tot , s[i]) - a;

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

return 0;

}

洛谷 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 ...

洛谷 P1168 中位數

這個題很簡單 但是我要講3種做法 我們維護乙個小根堆乙個大根堆,其中大根堆的堆頂小於小根堆的所有元素,待加入元素大於大根堆堆頂元素就加入小根堆,反之加入大根堆,然後維護兩個堆元素數量,使得兩個堆的元素數量差為1,這樣我們取兩個堆中元素多的那個的堆頂就是答案 初始化的時候先往大根堆裡加入乙個元素,避免...

洛谷 P1168 中位數

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