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行每行包含...