洛谷 P1168 中位數

2021-07-24 12:33:19 字數 1124 閱讀 2530

題目描述

給出乙個長度為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[i] (a[i] ≤ 10^9)。

輸出格式:

輸出檔案median.out包含(n + 1) / 2行,第i行為a[1], a[2], …, a[2i – 1]的中位數。

輸入輸出樣例

輸入樣例#1:

7 1 3 5 7 9 11 6

輸出樣例#1:

1 3 5 6

說明對於20%的資料,n ≤ 100;

對於40%的資料,n ≤ 3000;

對於100%的資料,n ≤ 100000。

【分析】

以前做過。。現在純屬水博。。

大根堆放小數,小根堆放大數,維護小根堆數目,始終比大根堆大

【**】

//poj 3784 running median

#include

#include

#include

#include

#define fo(i,j,k) for(i=j;i<=k;i++)

using

namespace

std;

priority_queue da;

priority_queue < int,vector

,greater > xiao;

int q,n,x,y,t;

int a[100005];

bool b;

int main()

while(xiao.size()!=da.size()+1 && da.size()>xiao.size())

//如果大根堆大

k=xiao.top();

a[++t]=k;

}fo(i,1,t) printf("%d\n",a[i]);

return

0;}

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

洛谷P1168中位數

傳送門啦 基本思想就是二分尋找答案,然後用樹狀陣列去維護有幾個比這個二分出來的值大,然後就沒有了 資料要離散,這個好像用map也可以,但是不會 那怎麼離散呢?我們先把a陣列讀入並複製給s陣列,然後排序a 這個時候a陣列就有序了,我們就可以把s陣列裡的值通過二分找到其在a陣列裡的下標,這樣就把1 1e...