看了此題,發現是求中位數,自然而然的想到了求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 ...