ZROI 19 08 03 分治與離線

2022-05-19 05:13:33 字數 2102 閱讀 8108

離線統計邊權(刪除時間),lct維護最大生成樹即可。

也可以按時間分治,維護乙個可回退並查集即可。

很好用,但是記不住。

有一種簡明的替代方式:畫一棵遞迴樹,考慮層數和每層的節點數(線段樹分析.jpg)

\[t(n)=\frac\sum_^n[t(i-1)+t(n-i)]+n-1=\frac\sum_^t(i)+n-1

\]\[n\cdot t(n)=2\sum_^t(i)+n(n-1)

\]\[(n-1)\cdot t(n-1)=2\sum_^t(i)+(n-1)(n-2)

\]\[n\cdot t(n)-(n-1)\cdot t(n-1)=2t(n-1)+2(n-1)

\]\[n\cdot t(n)=(n+1)t(n-1)+2(n-1)

\]\[\frac=\frac+\frac

\]\[f(n)=\frac=\sum_i^n\frac\leq \sum_i^n \frac=2\ln n

\]\[t(n)=o(n\log n)

\]對於期望複雜度經典的證明方法,乘上\(n\)再錯位相減。

考慮快速排序的過程,按某個中間值分成兩半,然後找對的一邊遞迴下去。期望\(o(n)\),然而最劣是\(o(n^2)\)。

發現最劣的情況在於每次都劃分出乙個大小為\(1\)的子問題。

可以把原序列分成\(5\)份,排成乙個\(5\times \frac n5\)的**。對每一列找出中位數,然後找到列的中位數,從這個位置劃分,可以保證每次問題規模最少降低\(o(\fracn)\)。

然而沒什麼用,因為常數巨大。

給我們的啟發意義在於,我們可以通過一些(大)合(常)理(數)手段劃分分治中心,從而降低複雜度。

sd省集講過,然而我又忘了。

證明:只需要找到總長度最小的一種方案,一定不會有交點。

一定可以找到一條直線把點集分開,使得兩邊紅黑點個數均相等。考慮座標最小的某個點為原點,把剩餘點按照極角排序,由於不存在三點共線,則一定有這樣的位置,恰好使兩邊相等。

最劣是\(o(n^2\log n)\),但是每次旋轉乙個角度,隨機選點跑得很快,\(o(\)能過\()\)。

把\(a_i\)取個字首和\(s_i\),發現把\((i,s_i)\)看作乙個點,就是乙個平面上距離。平面最近點對即可。我一開始想分治+斜率優化來著。

對於乙個點集\(s\),滿足條件的點構成乙個連通塊。樹上連通塊點數-邊數=1,所以對於每個點、每條邊分別統計滿足條件的點集容斥一下即可。

統計點集相當於對每個點(或邊建出來的虛點)統計距離不超過\(l\)的點數,然後算個組合數就好了。鄰域是經典問題,點分樹就好了。

令\(b_i=w_i-\sum w_\),則原條件等價於\(b_i\geq 0,\sum b_i=x\)。設連通塊大小為\(m\),則它的權值就是\(c(x+m-1,m)\)。

於是問題變成統計以\(1\)為根,大小為\(m\in[1,n]\)的連通塊個數。

這個若干天前講過,求生成函式,樹剖後分治fft即可。所以二叉樹這個性質有什麼用

「動態點分治模板題,大家一定都做過,不用講了。」

點分樹支援動態新增葉子,需要像替罪羊樹一樣重構。

等價於對每條邊\((u,v)\),統計\((u,v)\)是什麼時候開始相互可達的,然後用並查集計算即可。

整體二分。設\(solve(l,r,s)\)表示\(s\)裡所有邊都是在\([l,r]\)時間段開始相互可達的。(在執行這個函式之前,且所有加入時間在\([1,l)\)的,且在\(s\)內的邊均已加入並縮點完畢,孤立點被刪除。)

我們把\(s\)中\([l,mid]\)的邊都加入然後縮點,即可據此把\(s\)分為兩部分,遞迴即可。右邊可以直接遞迴,左邊需要對縮點可回退化一下。**很不可寫。只對涉及到的點進行計算,單次遞迴複雜度是\(o(|s|)\)的,每條邊只會被計算\(o(\log)\)次。

維護從左上角出發的最短路徑樹。

發現起點向下移動的時候,每個點在樹上的父親是逆時針單調旋轉的,且最多變\(2\)次。

對於乙個時間區間\([l,r]\),如果乙個點沒有變父親,它們是可以縮起來的。然後就和上一題一模一樣了。

類似階乘逆元的求法,求字首積然後反向遞推回去即可。複雜度\(o(n+\log p)\)。

樹上分塊+四毛子,塊大小\(o(\log\log n)\),可以做到線性。

tarjan+並查集實現。

離線分治 整體二分與CDQ分治

這兩個演算法都是離線的分治演算法。其中cdq分治是基於時間的分治演算法。整體二分是基於值域的分治演算法。先講講整體二分吧。我們拿 zjoi2013 k大數查詢作為例子。一 原理 將所有的修改和查詢操作離線存下來。每次二分所有修改和詢問操作,分成兩部分解決。二 每個子問題 slove front,la...

演算法分析與設計實踐 作業5 分治最近對問題

有n個點在公共空間中,求出所有點對的歐幾里得距離最小的點對。歐幾里得距離計算公式 將集合s分成兩個子集s1和s2,根據平衡子問題原則,每個子集中的點數大致都為n 2。這樣分治後,最近點對將會出現三種情況 在s1中,在s2中或者最近點對分別在集合s1和s2中。利用遞迴分析法分別計算前兩種情況,第三種方...

演算法設計與分析(edu實訓)實驗五 分治法

任務描述 本關任務 利用分治法求一組資料中最大的兩個數和最小的兩個數。程式設計要求 請在右側編輯器begin end處補充 完成本關任務。測試說明 平台會對你編寫的 進行測試,比對你輸出的數值與實際正確數值,只有所有資料全部計算正確才能通過測試 測試輸入 10 資料的總個數 1 此行及以下為具體的每...