\(O(n\log n)\)求通常冪多項式的不定和式
即給定多項式\(\sum_{k=0}^{n-1}a_kx^k\),求\(\sum_{k=0}^{n-1}a_kS_k(x)\)的系數。其中\(S_k(x)=\sum_{i=0}^{x-1}i^k\)。
考慮從奇怪的角度出發:
其中\(\sum_{i=0}^{n-1}e^{ix}\)可以用等比數列求和公式簡化為\(\frac{e^{nx}-1}{e^x-1}\)。發現分母和求和指標\(i\)是無關的,我們嘗試將其分離。但是由於\(e^x-1\)常數項為\(0\)無法直接分離,所以我們考慮在等式右邊乘以\(x\),將\(\frac{x}{e^x-1}\)分離。即:
實際上\(\frac{x}{e^x-1}\)就是伯努利數的指數生成函數,我們將其簡記為\(B\)。
那么我們直接展開兩個多項式相乘的系數,可以得到:
於是可以得到:
回代到原式可得:
直接進行卷積即可。
板子題:洛谷P3711。
點分治中降低復雜度的一種方法
有時點分治的過程要求我們求出從分治部分的根到重心的信息,如果直接做通常會成為復雜度瓶頸,使復雜度多一個\(\log\)之類的。但是考慮到在遞歸至子樹的時候我們已經做了一部分這樣的問題了,我們也許可以利用這些結果來降低復雜度。設重心為\(x\),考慮從重心的父親\(y\)開始統計,可以發現\(y\)到划分給\(y\)的連通塊的根\(z\)的這段路徑已經統計好了,結果直接利用,但此時由於\(z\)被\(y\)遞歸求解了因此\(z\)本身並沒有存下更遠的路徑的信息。但是\(z\)的父親一定是離\(y\)最近的既是\(y\)的祖先又是點分樹上\(y\)的祖先的點,於是它一定統計了更遠的路徑,並且它負責的連通塊\(size\)至少是\(y\)的兩倍。於是我們在目前的基礎上添加\(z\)到\(z\)的父親的信息以及\(z\)的父親到所屬連通塊的根的信息即可。我們可以不斷合並這些信息直到到達\(x\)的根為止。
詳情可以見例題UOJ #23,只不過這道題是仙人掌,可能有些丑陋。其實thusc2018有一道更好的題,可以用點分治加上面的技巧在\(O(n\log^2n)\)的時間內解決(不用這個方法則是\(O(n\log^3n)\)的),做到了和標算一樣的復雜度。有興趣的可以上網搜一搜題目。
最小割的一種建圖方法和個人理解
最小割模型中一條\(S\to T\)的路徑上的邊可能會被割大於一條的數量,如果想要限制這條路徑最多只割一條邊,可以給這條路徑加上容量為\(\infty\)的反向弧。
個人感覺最小割其實是在做一種類似\(2-SAT\)的問題,只不過最小割可以求出代價最小的一種方案(\(2-SAT\)的代價只能是\(\infty\)),但不可以支持兩個條件同時為真/假時需要付出代價的限制(但如果這類代價只會在兩個不交的集合之間發生顯然可以黑白染色后再用最小割做)。所以假如你感覺題目是在讓你求一個有代價的\(2-SAT\)問題,而數據范圍又不大的時候,基本可以往最小割方向想了。
一種吊打(?)cdq分治的離線統計法
cdq分治可以用於解決一類“貢獻獨立,允許離線”的統計性問題。主要思想是通過對時間分治消除時間的影響,只需靜態的統計前半部分的插入對后半部分詢問的影響就可以了。不過,對於同樣貢獻獨立,但是允許刪除的問題,cdq分治有時就會失效。但是此時我們可以考慮更換一種分組統計的方法,建立時間線段樹。此時一個插入操作對一段區間有效。對於時間線段樹上的每個節點,我們靜態統計包含這個區間的所有插入操作對這個區間中的詢問的貢獻。這樣我們就可以支持刪除操作,復雜度和cdq分治還是一樣的。
圖的四元環計數
當然由於數量很多肯定是不能隨心所欲的計數的。通常四元環的貢獻是邊權的乘積,就以這個為例。可以像三元環計數一樣,枚舉所有\(x\to y\to z\)的路徑。我們在\(z\)中記錄當前所有不同的\(y\)的\(x\to y\to z\)的路徑的權值和,在又一次枚舉到\(z\)的時候將貢獻相乘統計進答案里就可以了。復雜度也是\(O(m\sqrt m)\)的。
利用四毛子優化常數時間復雜度
有時候我們對一個對象計算答案的時候需要遞歸到更小的情況,這樣的復雜度可能稍微超出限制。但是考慮到遞歸至極小的情況(比如\(O(\log n)\)的級別)的時候本質不同的情況不會很多,我們可以預處理它們以直接獲得答案,減少遞歸次數。
通常可以令復雜度除以\(\log\)。