1. 程式人生 > >[luogu]P1168 中位數[堆]

[luogu]P1168 中位數[堆]

ace 題意 輸出 包含 ostream iostream media p s space

[luogu]P1168

中位數

——!x^n+y^n=z^n

題目描述

給出一個長度為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#:

7
1 3 5 7 9 11 6

輸出樣例1#:

1
3
5
6

【數據範圍】

對於20%的數據,N ≤ 100;

對於40%的數據,N ≤ 3000;

對於100%的數據,N ≤ 100000。


好尷尬,一開始理解錯題意,把序列排序就輸出來了,感覺好傻...

維護兩個堆,一個大根堆,一個小根堆,小根堆的最小元素比大根堆的最大元素大,每加進一個元素,如果比大根堆的最大元素小,加到前面的大根堆,否則加到後面的小根堆。

調整小根堆的大小使其為(i+1)/2。

c++的話用STL非常方便。

代碼:

 1 #include<iostream>
 2
#include<cstdio> 3 #include<cstring> 4 #include<queue> 5 using namespace std; 6 inline int read(); 7 const int maxn = 1e5 + 7 ; 8 priority_queue< int > a; 9 priority_queue< int > b; 10 int n; 11 namespace lys{ 12 int main(){ 13 int i,x,y;
14 n=read(); 15 for(i=1;i<=n;i++){ 16 x=read(); 17 if(a.empty()) a.push(x); 18 else{ 19 if(x<=a.top()) a.push(x); 20 else b.push(-x); 21 } 22 if(a.size()<((i+1)>>1)){ 23 x=b.top(); 24 b.pop(); 25 a.push(-x); 26 } 27 else if(a.size()>((i+1)>>1)){ 28 x=-a.top(); 29 a.pop(); 30 b.push(x); 31 } 32 if(i&1){ 33 x=a.top(); 34 printf("%d\n",x); 35 } 36 } 37 return 0; 38 } 39 } 40 int main(){ 41 lys::main(); 42 return 0; 43 } 44 inline int read(){ 45 int k=0,f=1; 46 char c=getchar(); 47 while(c<0||c>9){ 48 if(c==-) 49 f=-1; 50 c=getchar(); 51 } 52 while(c>=0&&c<=9){ 53 k=k*10+c-0; 54 c=getchar(); 55 } 56 return k*f; 57 }

[luogu]P1168 中位數[堆]