可持久化數據結構
A.森林
樹上的數據結構常可以啟發式合並,
用啟發式合並的思路合並樹上主席樹就可以了。
B.影魔
一個常見的這種數據結構題的套路是:
離線詢問,按右端點排序。
在右指針掃過去的同時在數據結構(常為線段樹)中更新該右端點能產生的答案。
同時在數據結構中查詢統計右端點對應的區間就好了。
C.世博會
對於很多個點對\((x,y)\),\((X,Y)\)要求\(max(|X-x|,|Y-y|)\)。
這個玩意並不能簡單地用數據結構維護。
然后發現這個玩意是切比雪夫距離。
對於點對的曼哈頓距離\(|X-x|+|Y-y|\),
不妨將\((x,y)\)轉化為\((x+y,x-y)\),然后發現曼哈頓距離轉化為了切比雪夫距離。
也就是說可以通過反向的轉化\((x,y)\rightarrow(\frac{x+y}{2},\frac{x-y}{2})\)。
然后問題轉化為了易於維護的的曼哈頓距離,在本題中找中位數就好了。
插頭dp
A.游覽計划
網格圖上的最小生成樹(斯坦納樹)。
一種較為簡單的做法是狀壓,\(dp_{x,S}\)表示點\(x\),聯通的點集為\(S\)的最小代價(通過spfa實現)。
轉移考慮兩種情況:
1.拓展到相鄰的格子,即仍然維護原樹的一條鏈狀結構。
2.合並兩種狀態(枚舉與\(S\)無交集的集合\(T\),將\(dp_{x,s}\)和\(dp_{x,T}\)合並為\(dp_{x,S|T}\)),即將兩條鏈(實際上是樹)合並。
多項式
A.Normal
期望的一種轉化形式,與下面兩個式子的轉化很類似。
\(E(x)=\sum \limits_{i=0}^{+\infty}i*p(x==i)\)
\(E(x)=\sum \limits_{i=0}^{+\infty}p(x>=i)\)
考慮將每個節點的期望深度,轉化為其他的節點成為它祖先的概率和。
點對\((i,j)\),如果\(j\)成為\(i\)的祖先,一定滿足\((i,j)\)鏈上沒有節點被選。
所以這個概率即\(\frac{1}{dis(i,j)}\),用點分治統計出所有點對的概率和就好了。
B.序列統計
將取模意義下轉移並不連續,形式不優美的原值。
轉化為原根的\(k\)次方所表示的數,於是可以用循環矩陣優化,於是可以套上NTT作快速冪(或是多項式exp)。
C.染色
看到恰好形式,考慮二項式反演。
題意中出現了兩個恰好,但是發現有一個恰好是容易保證的,即欽定顏色的出現次數。
所以對多少個顏色恰好出現\(k\)次進行二項式反演就好了。
D.城市規划
設\(f_i\)表示\(i\)個點的符合條件的聯通圖,\(g_i\)表示\(i\)個點的任意圖。
欽定最后一個聯通塊大小,欽定一個點在最后一個聯通塊(這點很關鍵),就可以直接通過補集容斥求出\(f_i\)了。
暴力的做法是分治FFT,化一化式子可以發現可以做多項式求逆。
然而還可以直接用EGF搞這個題。
設\(F(x)=\sum \limits_{i=0}^{\infty}\frac{f_i*x^i}{i!}\)為有標號聯通圖的EGF。
\(G(x)=\sum \limits_{i=0}^{\infty}\frac{g_i*x^i}{i!}\)為有標號任意圖的EGF。
枚舉任意圖划分為幾個聯通塊,則有\(G(x)=\sum \limits_{i=0}^{\infty}\frac{F^i(x)}{i!}\)
因為原本是有標號的,乘上可重排列數后仍是有標號的。
因為多項式乘法作的是排列,所以要除掉\(i!\)。
可得\(G(x)=e^{F(x)}\),即\(F(x)=ln(G(x))\)。
E.按位或
考慮\(minmax\)容斥。
用每個集合中最早出現的1的期望,容斥出最晚出現的1,也就是全部變成1的期望。
\(E=\frac{1}{p}\),所以只要求出與每個集合的每一位1集合有交的概率和。
將這個玩意轉化為與集合無交,就是簡單的子集求和了。
F.遺忘的集合
要求我們通過背包得到的\(dp\)數組,反推回保證體積各不相同的物品體積。
推一下\(OGF\)的式子。
優化01背包:
設容量為\(i\)的物品有\(a_i\)個,在本題中僅有0/1兩種取值。
\(F(x)\)表示答案的生成函數。
那么有\(F(x)=\prod \limits_{i=1}^{n}(1+x^i)^{a_i}\)
\(=exp(ln(\prod \limits_{i=1}^{n}(1+x^i)^{a_i}))\)
\(=exp(\sum \limits_{i=1}^{n}a_iln(1+x^i))\)
\(=exp(\sum \limits_{i=1}^{n}a_i\sum \limits_{j=1}^{\infty}\frac{(-1)^{j-1}(x^i)^j}{j})\)
優化完全背包:
設容量為\(i\)的物品有\(a_i\)個,在本題中僅有0/1兩種取值。
\(F(x)\)表示答案的生成函數。
那么有\(F(x)=\prod \limits_{i=1}^{n}(\frac{1}{1-x^i})^{a_i}\)
\(=exp(ln(\prod \limits_{i=1}^{n}(\frac{1}{1-x^i})^{a_i}))\)
\(=exp(\sum \limits_{i=1}^{n}a_iln(\frac{1}{1-x^i}))\)
\(=exp(\sum \limits_{i=1}^na_i\sum \limits_{j=1}^{\infty}\frac{(x^i)^j}{j})\)
這個時候發現已經可以\(O(nlnn)\)求出exp里面的式子,做個多項式exp就好了。
在本題中我們有了\(F(x)\),兩邊同時求\(ln\),可得\(\sum \limits_{i=1}^na_i\sum \limits_{j=1}^{\infty}\frac{(x^i)^j}{j}\)
對每一項的系數作莫比烏斯反演,即可得到\(a_i\)的取值。
G.獵人殺
一個結論是,不考慮已經死掉的獵人,一直射下去直到射死活着的獵人,不影響最終的獲勝者。
之后只要容斥就好了,設\(f_S\)表示至少集合\(S\)中的獵人在\(1\)號獵人后面死。
\(S\)中元素的權值和為\(s\),全集的權值和為\(W\)。
有\(f_S=\sum \limits_{i=0}^{\infty}(\frac{W-s-w_1}{W})^i\frac{w_1}{W}\)
\(ans=\sum \limits_{S}(-1)^{|S|}f_S\)
\(f_S=\sum \limits_{i=0}^{\infty}(\frac{W-s-w_1}{W})^i\frac{w_1}{W}\)
\(=\sum \limits_{i=0}^{\infty}(1-\frac{s+w_1}{W})^i\frac{w_1}{W}\)
\(=\frac{1}{\frac{s+w_1}{W}}\frac{w_1}{W}\)
\(=\frac{w_1}{s+w_1}\)
所以只要通過01背包預處理出對於每個\(s\)的容斥系數,之后一次性統計就好了。
因為題中保證了\(W\)並不大,所以本題直接分治/啟發式合並就可以做到\(O(nlog^2n)\)。
用上面的套路exp優化背包,可以做到\(O(nlogn)\),然而實測跑不過分治,哭了。