高斯消元數組
FFT/NTT數據結構
拉格朗日插值優化
LCTui
splayspa
K-D Tree指針
二分圖/最大流/費用流code
後綴數組後綴自動機排序
總體二分遞歸
Polya定理隊列
對於知足
\(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]\)
轉移狀態不是太多的時候能夠預處理全部有效狀態
對於LCS這種每次只有一個會改變的dp能夠記錄差分以後的狀態
數位dp + LIS 能夠經過狀壓01來還原狀態
對於一類有後效性的狀壓dp能夠考慮SPFA
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; }
所有訪問->第一次訪問
\[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方程變成推係數的形式,先把葉子節點和非葉子節點拆開,發現1號節點不用從父親轉移過來從而解方程。
枚舉子樹dp的複雜度是\(O(n^2)\)
上面的dp若是是卷積形式能夠用NTT優化
樹形依賴揹包能夠用點分治+dfs序轉移優化爲\(n log n\),(不選直接從i+siz[i]+1的位置轉移不然從i+1轉移)
單調隊列優化多重揹包...我以爲寫不出來,到時候寫二進制拆分吧。
能夠二分一個權值,當選擇一個數的時候加上該權值。這個時候可能還知足其餘的單調性,也能夠打表找一下[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\)
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] = \sum_{j=1}^i {f[j] * f[i - j]}\)
對於要統計\(i - j\)的貢獻的能夠考慮翻轉其中一個的下標變爲\(i + (N - j)\)
含有通配符的字符串匹配問題能夠構造多項式
基本不會,考到算倒黴。
若是有減法操做能夠維護最大最小值,當除以一個數對於最大最小值產生的影響相同時改成減法運算
複雜度\(O(n \log^2 n)\)
維護區間\(and\)區間\(or\),若\(and\)上一個對兩個標記的影響是相同的就改成區間加法(直接下傳標記便可)。
記錄區間最小值/次小值
若最小值\(\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;
這東西通常離線作比較穩,也就是從下往上合併的過程當中就把詢問都處理掉
不然每次須要新建一個節點
考到認倒黴。。
記\(A\)爲無向圖的度數矩陣(A[i][i]表示\(i\)號點的度數),\(D\)爲無向圖的鄰接矩陣\(D[i][j]\)表示\(i\)與\(j\)的邊數
記\(G = A - D\),那麼圖的全部不一樣的生成樹等於任意一個\(n - 1\)階主子式的行列式的絕對值
求行列式能夠直接高斯消元后把主對角線上的全部元素乘起來複雜度\(O(n^3)\)
求\(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\)時無解
\(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})\)
若是咱們要求\(\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)\)中的一個