傳送門啦
基本思想就是二分尋找答案,然後用樹狀陣列去維護有幾個比這個二分出來的值大,然後就沒有了;
資料要離散,這個好像用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 輸...