靜態區間第k大(分桶法和平方分割)

2022-05-28 01:57:11 字數 978 閱讀 4925

poj 2104為例

《挑戰程式設計競賽》中介紹的方法。

分桶法:把一排物品或者平面分成桶,每個桶分別維護自己內部的資訊,已達到高效計算的目的。

設一共有

n個數,每

b個分到乙個桶裡,並對桶內元素進行排序。給定區間,求小於x的數的個數如果b

=n−−

√,那麼這就叫平方分割,查詢過程時間複雜度為o(

n−−√

logn

),如果b=

nlog

n−−−

−−√,那麼複雜度為o(

nlog

n−−−

−−√)

,加上最外面的二分,整體時間複雜度為o(

nlog

n+mn

−−√l

og1.5n)。

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1e5+5, b = 1200;

int a[maxn], num[maxn];//[)

vector

v[maxn/b];

int main (void)

sort(num, num + n);

for(int i = 0; i <= n/b; i++)

sort(v[i].begin(), v[i].end());

int l, r, mid;

int lo, ro, k, tl, tr;

while(m--)

printf("%d\n",num[l]);

}return

0;}//11000ms

分桶法思想get了,可是這個跑的也真的是有點慢。。。

靜態區間第k大數

劃分樹版本 include include include include define maxn 100002 define mlog 19 using namespace std int tree mlog maxn cntleft mlog maxn sorted maxn void buil...

靜態區間 kth 第 k 小數

給定乙個長度為 n 的整數序列,下標為 1 sim n m 個操作,每次給定 l,r,k 表示詢問下標為 l sim r 的區間內第 k 小的數 1 leq n leq 10 1 leq m leq 10 a leq 10 值域很大,建立權值線段樹,權值線段樹要求離散化後的值之間的大小關係不發生改變...

主席樹 靜態區間第k小

這是個非常經典的主席樹入門題 靜態區間第k小 資料已經過加強,請使用主席樹。同時請注意常數優化 如題,給定n個整數構成的序列,將對於指定的閉區間查詢其區間內的第k小值。輸入格式 第一行包含兩個正整數n m,分別表示序列的長度和查詢的個數。第二行包含n個整數,表示這個序列各項的數字。接下來m行每行包含...