LGOJ P1168 中位數 解題報告

2021-09-26 07:12:34 字數 2160 閱讀 7506

lgoj p1168 中位數

我們要維護乙個長度不斷增加的序列的中位數,一般能想到的做法是動態開點線段樹。但是,實際上,我們可以使用堆來維護。

我們使用兩個堆來維護當前的序列。

乙個是大根堆,維護序列的前半段,乙個是小根堆,維護序列的後半段。

加入元素時,若其比大根堆的堆頂還大,它理應放在序列的後半段,即放入小根堆裡。反之同理。

接下來要做的就是調整了。使大根堆、小根堆的元素個數差不多,最多相差乙個。

然後,只要輸出元素多的那個堆的堆頂,就是要求的中位數了。

#define usefasterread 1 

#define rg register

#define inl inline

#define debug printf("[passing [%s] in line %d.]\n", __func__, __line__)

#define putline putchar('\n')

#define putsp putchar(' ')

#define rep(a, s, t) for(rg int a = s; a <= t; a++)

#define repdown(a, t, s) for(rg int a = t; a >= s; a--)

typedef

long

long ll;

#include

#if usefasterread

char in[

1<<20]

,*ss = in,

*tt = in;

#define getchar() (ss == tt && (tt = (ss = in) + fread(in, 1, 1 << 20, stdin), ss == tt) ? eof : *ss++)

#endif

struct io

template

<

typename t>

inline io r

(t& x)

const

template

<

typename t>

inline io w

(t x)

const

if(x >=10)

w(x /10)

;putchar

(x %10+

'0')

;return

*this;}

template

<

typename t>

inline io wl

(const t& x)

const

template

<

typename t>

inline io ws

(const t& x)

const

inline io l()

inline io s()

}io;

template

<

typename t>

inline t max

(const t& x,

const t& y)

template

<

typename t>

inline t min

(const t& x,

const t& y)

template

<

typename t>

inline

void

swap

(t& x, t& y)

template

<

typename t>

inline t abs

(const t& x)

#include

using

namespace std;

int n;

priority_queue<

int> b;

//大根堆,存前半段

priority_queue<

int, vector<

int>

, greater<

int>

> s;

//小根堆,存後半段

intmain()

return0;

}

P1168 中位數 題解

csdn同步 原題鏈結 簡要題意 給定乙個長度為 n 的序列 a 求 a 1 a x 的中位數。1 leq x leq n 且 x 為奇數 附註 中位數的定義 排序後位於最中間的數。如果長度為偶數則是最中間兩個數的平均值。n leq 10 5 a i leq 10 9 這個題水不水,就看你怎麼考慮了...

題解 P1168 中位數

看了此題,發現是求中位數,自然而然的想到了求kth 求kth有多種,我用的是權值線段樹,即記錄x的個數,但,我們看題,發現a i 可以高達1e9,乙個陣列是開不完的,不過萬幸的是n只到了1e5,而求kth只需要知道大小關係就行,不需要知道具體的值,所以,我們可以用離散化來搞定它!這裡說一下stabl...

堆 P1168 中位數

記錄乙個變數 mid 我們知道中位數是大小處於中間位置的數,所以建立兩個堆,乙個大根堆,乙個小根堆,大根堆存 mid 的數,小根堆存 mid 的數。所以我們每次向堆中加入元素時,就通過比較和 mid 的大小關係,選擇加入大根堆或者小根堆,但我們在輸出答案前需要對 mid 進行調整。如果大根堆和小根堆...