洛谷 P1168 中位數

2021-10-02 09:56:04 字數 2253 閱讀 6772

這個題很簡單√,但是我要講3種做法

我們維護乙個小根堆乙個大根堆,其中大根堆的堆頂小於小根堆的所有元素,待加入元素大於大根堆堆頂元素就加入小根堆,反之加入大根堆,然後維護兩個堆元素數量,使得兩個堆的元素數量差為1,這樣我們取兩個堆中元素多的那個的堆頂就是答案

初始化的時候先往大根堆裡加入乙個元素,避免**

堆的size()是unsigned int型別的,要強轉成int才能用abs

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int n=

100010

;int n,m,ans;

priority_queue<

int,vector<

int>

>qmax;

priority_queue<

int,vector<

int>

,greater<

int>

>qmin;

inline

intread()

void

file()

void

add(

int x)

intquery()

else}if

(qmin.

size()

>qmax.

size()

)return qmin.

top();

else

return qmax.

top();

}int

main()

return0;

}

維護乙個值域樹狀陣列,所以我們需要離散化,我們每次加入乙個數a[i

]a[i]

a[i]

,查詢的時候取字首和為(i−

1)/2

(i-1)/2

(i−1)/

2的位置即為答案

#include

#include

#include

#include

#include

#include

#define lowbit(x) (x&-x)

using

namespace std;

const

int n=

100010

;int n,m,a[n]

,b[n]

,tree[n]

,cnt;

inline

intread()

void

file()

void

add(

int x)

intfind

(int x)

return ans+1;

}int

main()

sort

(b+1

,b+n+1)

; cnt=

unique

(b+1

,b+n+1)

-b-1

;for

(int i=

1;i<=n;i++

)add

(a[1])

;printf

("%d\n"

,b[find(1

)]);

for(

int i=

2;i<=n+

1>>

1;i++

)return0;

}

最最簡單的做法,我們每次找到第乙個比要插入的數大的數,在它前面插入,查詢非常簡單了,不贅述qwq

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int n=

100010

;int n,m;

vector<

int>a;

inline

intread()

void

file()

intmain()

return0;

}

洛谷 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 中位數

給出乙個長度為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...