演算法學習 資料結構 李超樹

2022-05-05 15:54:07 字數 1559 閱讀 9010

·李超樹的具體實現過程:

我們先將每一條線段都表示成點斜式,接下來用\(k\)表示斜率,\(b\)截距。當我們插入一條線段\(y=kx+b\)的到區間\([l,r]\)(插入直線則是\([−inf,inf]\))時候,我們需要判斷這條線段是否可以更新這個這個區間的答案。我們記一條線段\(s\)為優勢線段,表示在這個區間\([l,r]\)中的線段中,\(s\)在\(mid=(l+r)>>1\)這個點上的\(y\)的值是最大的。那麼插入一條線段的時候,就會出現下面幾種情況:

當這個區間還沒有優勢線段的時候,就可以直接將該線段設成該區間的優勢線段,然後返回。

當這個區間已經有優勢線段,如果插入線段在區間\([l,r]\)的值都比該優勢線段大,那麼就可以直接替換掉這個優勢線段,然後返回。或者是在區間\([l,r]\)的都比該優勢線段小,那麼就可以直接返回了。

當這個區間的優勢線段\(seg\)和插入線段\(s\)存在某個交點的時候,顯然,我們需要更新這個區間的子區間的優勢線段的答案。我們假設交點位置為\(pos\),該區間中點位置為\(mid\),\(ysegl\),\(ysegr\)表示\(seg\)線段左右兩個端點的y值,\([ysl,ysr]\)同理。如果\(ysegl,\(ysegr>ysr\),那麼說明在\(pos\)右邊為\(seg\)優,\(pos\)左邊為\(s\)優,然後判斷此時\(pos\)的位置,如果此時\(pos\)的位置在\(mid\)的左邊,說明s這條優勢線段仍然需要下方到子區間去,然後繼續遞迴下去即可,另一半也是類似的。最後不要忘記更改本區間的優勢線段就行了。

查詢的話就比較簡單了,像普通的線段樹一樣,如果當前區間在查詢區間當中的話,那麼就直接返回當前優勢線段,否則遞迴處理,然後順便和當前區間優勢線段的\(y_}\)比較一下,返回值更加大的線段就行了。

·複雜度:對於查詢每乙個點的極值,複雜度都為\(o(log(n))\)。但是插入線段時,因為尋找插入的區間和標記都需要\(o(log(n))\)的時間,所以複雜度會是\(o(log^2(n))\),最後的總複雜度是\(o(nlog^2(n))\)

板子

#includeusing namespace std;

char s[10];

int n,tr[200010],cnt=0;

double k[100010],b[100010];

double f(int now,int x)

void update(int now,int l,int r,int x)

if(f(x,l)<=f(tr[now],l)&&f(x,r)<=f(tr[now],r))return ;

int mid=(l+r)/2;

if(k[tr[now]]f(tr[now],mid))

else update(now<<1|1,mid+1,r,x);

}else

else update(now<<1,l,mid,x);

}}double query(int now,int l,int r,int x)

int main()

else

}return 0;

}

寫完好晚了……先這樣吧

資料結構和演算法學習(10) 2 3 4樹

之前所提到的樹全部都是二叉樹,即每個節點有乙個資料項,每個節點最多有兩個子節點。有多個資料項和更多子節點的樹被稱作多叉樹,所要學習的2 3 4樹就是一種多叉樹,他的每個節點最多有四個子節點和三個資料項。2 3 4樹同紅黑樹一樣是平衡樹,他的效率稍差,但是程式設計更加容易 2 3 4樹名字中的2 3 ...

演算法學習 資料結構2

1 資料結構概述 數結構是計算機中對資料的一種儲存和組織方式,同是也泛指相互之間存在一種或多種特定關係的資料的集合。2 資料結構中的基本概念 資料 data 資料是資訊的載體,其能夠被計算機識別 儲存和加工處理,是電腦程式加強的 原材料 資料元素 data element 資料元素是資料的基本單位,...

資料結構與演算法學習

我想重新學習一下資料結構與演算法,打好基礎。to measure is to know.我們用演算法複雜度t n 來表示演算法的效率,效能。t n 的取值 所有問題規模為n的問題例項中,將他們的計算成本進行總體的比較,取出最壞情況下的值。有幾點需要catch,1.演算法執行的時間,會根據程式語言,作...