中位數之最

2022-07-06 14:42:13 字數 1025 閱讀 3778

給出乙個長度為 \(n\) 的序列 \(a\),你能任選乙個區間長度區不小於 \(k\) 的區間,那麼在這些的區間中能得到的區間中位數最大值是多少?

此題中位數指:有 \(n\) 個數,第 \(\lfloor \frac \rfloor\) 個數記為中位數。

資料範圍:\(1≤k≤n≤2*10^5,1≤a_i≤n\) 。

把所以滿足條件的區間中位數都放入乙個集合中,集合的最大值即為答案。

通過列舉的方式得到集合肯定是不行的,但可以通過對集合內 $ >x$ 的元素計數的方式來確定乙個數在集合中的位置,比如若集合最大值 \(\leq x\),那麼集合中 \(>x\) 的元素個數為 \(0\) ,否則集合中 \(>x\) 的元素個數不為 0,顯然 \(x\) 具有單調性,通過計數結果可以對 \(x\) 的位置進行檢驗。

計數方法,設 \(p_i\) 為 \([1,i]\) 中 \(\leq x\) 的數的個數。如果區間 \([l, r]\) 的中位數 \(>x\),可以得到 \(r-(l-1) > 2*(p_r-p_)\) ,將式子簡化為 \(r-2*p_r > (l-1) - 2*p_\) ,又因為區間長度至少為 \(k\),所以對於右端點 \(r\),它的左端點只能在 \([0,r-k]\) 之間選定,這就可以用樹狀陣列進行計數。

#includeusing namespace std;

const int maxn = 2e5+1;

int a[maxn], b[maxn], n, k;

int p[maxn], q[maxn], tree[maxn<<1];

void add(int x, int val)

}int sum(int r)

return res;

}bool check(int x)

return res;

}int main()

int l = 1, r = n;

while(l < r)

cout << l << "\n";

return 0;

}

中位數的中位數

參照王曉東的演算法設計 中位數的中位數,即將一串數分成n段,求其排好序了的中間那個數,再把這些所有中位數再求一次中位數。for int i 0 i r p 4 5 i 找中位數的中位數,r p 4即上面所說的n 5 int x lineselect a,p,p r p 4 5,r p 4 10 線性...

BFPRT(中位數的中位數)演算法

又稱為 中位數的中位數演算法 該演算法由 blum floyd pratt rivest tarjan 在1973年提出,最壞時間複雜度為o n 最差的空間複雜度為o logn 演算法步驟 1 將 n 個元素劃分為 n 5 個組,每組 5 個元素,若有剩餘,捨去 2 使用排序方法找到 n 5 個組中...

hive 中位數 Hive的中位數

關於求解中位數,我們知道在python中直接有中位數處理函式 mean 比如在python中求解乙個中位數,很簡單。python計算中位數 import numpy as np nums 1.1,2.2,3.3,4.4,5.5,6.6 均值np.mean nums 中位數 np.median num...