題解 P1168 中位數

2022-03-03 23:07:28 字數 1447 閱讀 7626

看了此題,發現是求中位數,自然而然的想到了求kth

求kth有多種,我用的是權值線段樹,即記錄x的個數,但,我們看題,發現a[i]可以高達1e9,

乙個陣列是開不完的,

不過萬幸的是n只到了1e5,而求kth只需要知道大小關係就行,不需要知道具體的值,所以,我們可以用離散化來搞定它!

這裡說一下stable_sort,它其實跟sort差不多,不過區別在於相同元素sort後的值是一樣的!

所以stable_sort極適合用於離散化

我們動態將此時的a[i] (離散化後) 的個數+1,然後每到i為奇數時我們就求出的(i+1)/2大的數即可了~

以下是**:

#include//

離散化+權值線段樹求kth

using

namespace

std;

const

int n=1e5+1

;

long

long

a[n];

long

long

e[n],b[n];

intc[n];

int d[n<<2

]; inline

long

long

read()

while(isdigit(ch)) x=(x<<3)+(x<<1)+(ch^48),ch=getchar();

return w?-x:x;

}//快讀

inline bool kk(int x,int

y) inline

void up(int now,int l,int r,int

x)

int mid=((l+r)>>1

);

if(x<=mid)

up(now

<<1|1,mid+1,r,x);//

向右查詢

} inline

int kth(int now,int l,int r,int

x)

int ls=now*2

;

int mid=((l+r)>>1

);

if(d[ls]>=x)

return kth(ls|1,mid+1,r,x-d[ls]);//

注意這裡是x-d[ls],因為前半段有d[ls]個數,那麼,kth在後半段的排名應為x-d[ls]

}

intmain()

stable_sort(c+1,c+n+1,kk);//

stable排序

for(int i=1;i<=n;++i)

for(int i=1;i<=n;++i)

for(int i=1;i<=n;++i)

}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 中位數

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

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