臨時抱佛腳

臨時抱佛jio

須要打的板子

高斯消元數組

FFT/NTT數據結構

拉格朗日插值優化

LCTui

splayspa

K-D Tree指針

二分圖/最大流/費用流code

後綴數組後綴自動機排序

可能還須要從新學一下的東西

總體二分遞歸

Polya定理隊列

dp

區間dp

對於知足

\(f[i][j] = min(f[i][k], f[k + 1][j])\)的dp方程,猜測其知足四邊形不等式

\(s[i][j]\)表示\(f[i][j]\)取到最優值的決策點,有\(S[i][j - 1] \leqslant S[i][j] \leqslant S[i + 1][j]\)

狀壓dp

  • 轉移狀態不是太多的時候能夠預處理全部有效狀態

  • 對於LCS這種每次只有一個會改變的dp能夠記錄差分以後的狀態

  • 數位dp + LIS 能夠經過狀壓01來還原狀態

  • 對於一類有後效性的狀壓dp能夠考慮SPFA

  • 給一個序列,對每一個\(i\),求a[i] xor a[j], a[i] or a[j]的最大值能夠暴力記錄子集記憶化
void insert(int x) {
    //if(mark[x]) return ;
    mark[x] = 1;
    for(int i = 0; i < 20; i++)
        if((x >> i & 1) && (!mark[x ^ (1 << i)]))
            insert(x ^ (1 << i));
}

枚舉子集

for(int i = S; ; i = (i - 1) & S) {
    
    if(!i) break;
}

MinMax容斥

所有訪問->第一次訪問

\[E(\max(S)) = \sum_{T \subseteq S} (-1)^{T + 1} E(\min(S))\]

高維前綴和

統計全部\(i \& j = j\)\(a[j]\)之和

實際上就是每次枚舉一位而後算以前位的全部子集的貢獻

for(int i = 0; i < B) {//必須先枚舉這個
    for(int j = 0; j < (1 << B); j++)//下標必須從0開始
        if(j & (1 << i)) f[j] += f[j ^ (1 << i)];
}

指望dp

  • 一般是記錄到達終止節點的指望步數

  • 指望 = 權值 * 機率

  • 發現指望dp中只與前一輪狀態有關時能夠矩乘優化

  • 樹上指望dp能夠直接拆dp方程變成推係數的形式,先把葉子節點和非葉子節點拆開,發現1號節點不用從父親轉移過來從而解方程。

揹包dp

  • 枚舉子樹dp的複雜度是\(O(n^2)\)

  • 上面的dp若是是卷積形式能夠用NTT優化

  • 樹形依賴揹包能夠用點分治+dfs序轉移優化爲\(n log n\),(不選直接從i+siz[i]+1的位置轉移不然從i+1轉移)

  • 單調隊列優化多重揹包...我以爲寫不出來,到時候寫二進制拆分吧。

凸優化

  • \(k\)的限制,當不考慮\(k\)限制時的dp比較好寫,打表發現dp數組斜率單調

能夠二分一個權值,當選擇一個數的時候加上該權值。這個時候可能還知足其餘的單調性,也能夠打表找一下[SDOI2016]征途

\(g[N]\)表示選了幾個,更新答案的時候只須要在必定能夠取到的點更新便可

while(l < r) {
    LL mid = l + r >> 1;
    check(mid);
    if(g[N] > M) l = mid + 1;
    else r = mid, ans = M * (f[N] - mid * M) - sqr(s[N]);
}

虛樹

  • 有效的點不會太多

考慮獲得了詢問點,如何構造出一棵虛樹。

首先咱們要先對整棵樹dfs一遍,求出他們的dfs序,而後對每一個節點以dfs序爲關鍵字從小到大排序

同時維護一個棧,表示從根到棧頂元素這條鏈

假設當前要加入的節點爲\(p\),棧頂元素爲\(x = s[top]\)\(lca\)爲他們的最近公共祖先

由於咱們是按照dfs序遍歷,所以\(lca\)不多是\(p\)

那麼如今會有兩種狀況

\(lca\)\(x\),直接將\(p\)入棧。
\(x,p\)分別位於\(lca\)的兩棵子樹中,此時\(x\)這棵子樹已經遍歷完畢,(若是沒有,即x的子樹中還有一個未加入的點y,可是dfn[y]<dfn[p],即應先訪問y), 咱們須要對其進行構建

設棧頂元素爲\(x\),第二個元素爲\(y\)

  • \(dfn[y]>dfn[lca]\),能夠連邊\(y->x\),將\(x\)出棧;
  • \(dfn[y]=dfn[lca]\),即\(y=lca\),連邊\(lca->x\),此時子樹構建完畢(break);
  • \(dfn[y]<dfn[lca]\),即\(lca\)\(y,x\)之間,連邊\(lca->x\)\(x\)出棧,再將\(lca\)入棧。此時子樹構建完畢(break)。
void insert(int x) {
    if(top == 1) {st[++top] = x; return ;}
    int lca = HLP::LCA(x, st[top]);
    if(lca == st[top]) {st[++top] = x; return ;}
    while(top > 1 && dfn[st[top - 1]] >= dfn[lca]) AE(st[top - 1], st[top]), top--;
    if(lca != st[top]) 
        AE(lca, st[top]), st[top] = lca;
    st[++top] = x;
}
sort(p + 1, p + K + 1, comp);
for(int i = 1; i <= K; i++) {
    if(p[i] != 1) insert(p[i]);
    siz2[p[i]] = 1;
}
while(top > 1) AE(st[top - 1], st[top]), top--;

斜率優化

考慮把式子化成\(y = k x + b\)的形式

能夠先用\(j > k\)\(j\)\(k\)優推出式子而後再考慮斜率/座標是否單調。。

斜率單調:直接維護指針掃

斜率不單調:二分凸包

加入座標單調:單調隊列

加入座標不單調:cdq

其餘套路

  • 對於\(f_{i,j}=\min\limits_{k=1}^{i}\{f_{k,j-1}+w_{k,i}\}\)類型的式子考慮分治dp/二分決策棧

多項式

FFT

  • 卷積形式\(f[i] = \sum_{j=1}^i {f[j] * f[i - j]}\)

  • 對於要統計\(i - j\)的貢獻的能夠考慮翻轉其中一個的下標變爲\(i + (N - j)\)

  • 含有通配符的字符串匹配問題能夠構造多項式

FWT

基本不會,考到算倒黴。

拉格朗日插值

  • \(\sum_{i=1}^n i^k\)是一個\(k\)次多項式,能夠\(O(k \log k)\)計算

數據結構

平衡樹

  • set啓發式合併複雜度\(n \log^2 n\)

勢能均攤線段樹

  • 帶有區間除法的線段樹

若是有減法操做能夠維護最大最小值,當除以一個數對於最大最小值產生的影響相同時改成減法運算

複雜度\(O(n \log^2 n)\)

  • 區間and 區間or

維護區間\(and\)區間\(or\),若\(and\)上一個對兩個標記的影響是相同的就改成區間加法(直接下傳標記便可)。

  • 區間對\(x\)取max

記錄區間最小值/次小值

若最小值\(\geqslant x\)則返回,不然若\(x\)大於最小值但小於次小值那麼只考慮次小值的影響,不然暴力遞歸

複雜度\(O(n \log^2 n)\)

超哥線段樹

每一個點上加入一個直線,能夠直接標記永久化,每次 下放較短的一段。

複雜度\(O(n \log^2 n)\)

主席樹

主席樹在某些狀況下能夠支持區間加1,這時候只須要維護區間值/被加的次數標記永久化便可

樹鏈剖分

從一個點到根的重鏈不會超過\(\log n\)條,因此有時候能夠暴力找出來搞事情。

二維樹狀數組

空間開不下?

\(tan 90^o\)

unordered_map<int, unordered_map<int, int> > T;

線段樹合併

這東西通常離線作比較穩,也就是從下往上合併的過程當中就把詢問都處理掉

不然每次須要新建一個節點

計算幾何

  • \(atan2(y, x)\)可獲取極角

數學

Polya定理

考到認倒黴。。

MatrixTree定理

  • 給定一張無向圖,求出其生成樹的個數

\(A\)爲無向圖的度數矩陣(A[i][i]表示\(i\)號點的度數),\(D\)爲無向圖的鄰接矩陣\(D[i][j]\)表示\(i\)\(j\)的邊數

\(G = A - D\),那麼圖的全部不一樣的生成樹等於任意一個\(n - 1\)階主子式的行列式的絕對值

求行列式能夠直接高斯消元后把主對角線上的全部元素乘起來複雜度\(O(n^3)\)

BSGS

\(a^x \equiv N \pmod P\)的最小的\(x\)

\(a^{i * k - j} \equiv N \pmod P\)

\(a^{i * k} \equiv N * a^j \pmod P\)

能夠分爲\(\sqrt{P}\)塊暴力hash

\(gcd(a, P) \not = 1\)時無解

Catalan數

\(f(n) = \frac{C_{2n}^n}{n + 1}\)

錯排問題

\(D(n) = (n - 1)(D(n - 2) + D(n - 1))\)

盧卡斯定理

\(C_n^m \% P = C(n \% p, m \% p) * C(\frac{n}{p}, \frac{m}{p})\)

斯特靈數

杜教篩

擴展歐拉定理

MillerRabin

反演

其餘

01分數規劃

若是咱們要求\(\sum \frac{A_i}{B_i}\)最大

能夠二分答案,咱們要求\(\sum \frac{A_i}{B_i} \geqslant K\)

\[\sum{A_i} - K(\sum B_i) \geqslant 0\]

也就是每選一個會產生\(A_i - K B_i\)的貢獻

樹的直徑

\((a, b)\)爲第一棵樹中的直徑端點,\((x, y)\)爲第二棵樹中的直徑端點。

將這兩棵樹合併後的樹的直徑必定是\((a, x) (a, y) (b, x) (b, y)\)中的一個

相關文章
相關標籤/搜索