考場策略:算法
算法與數據結構:數組
樹:(動態)點分治,DFS序,樹鏈剖分,長鏈剖分,動態樹,dsu on tree,樹形DP,lca,虛樹,樹上差分,樹上高斯消元,kruskal重構樹,動態DP,ETT,prufer序列。網絡
點分治:有兩種統計方式,一種是逐個子樹統計,還有一種是所有搞到一塊兒而後一塊兒統計,想辦法去重。數據結構
動態點分治:每層的重心之間連邊,樹高log。維護點分子樹到該點的信息,可套線段樹。通常要消去每一個點分子樹內部的影響。不可減信息用DFS序來消去,對每一層的點分子樹維護在原樹上的DFS序。經常使用O(1)lca。函數
樹鏈剖分:可優化連邊,可預處理作到一個log。優化
長鏈剖分:O(1)k級祖先,O(n)處理樹上與深度有關的信息,可與貓樹結合作到O(1)回答詢問。spa
動態樹:可維護子樹信息,樹上染色,邊雙連通份量,某種生成樹。可與ETT/sam配合。指針
dsu on tree:樹上啓發式合併。能夠拿來打暴力。排序
樹形DP:可用一維狀態表示在子樹外xxxx。可用長鏈剖分優化。轉移的時候可新開一個數組複製過去,別忘了給原數組賦0。逐子樹合併。可二次掃描與換根法。字符串
lca:O(1),可用來處理一些樹上可減信息。
虛樹:可套總體二分 + 線段樹合併。按照DFS序排序。
樹上差分:進子樹和出子樹的時候分別統計一次。也可用到根路徑和lca來差分,常與主席樹結合。
樹上高斯消元:每一個點的信息能夠只被父親表示。設出係數而後化式子。
kruskal重構樹:樹上倍增。能夠建兩棵,用DFS序轉到二維平面。
動態DP:樹剖維護線段信息。
ETT:有根樹splay維護括號序列。
prufer序列:每一個點的度數爲出現次數 + 1。可用於計數。
數據結構:(可持久化)線段樹(合併/分裂)(貓樹/吉司機線段樹),樹狀數組,左偏樹,splay,非旋treap,STL,並查集,單調棧,樹套樹,ST表,鏈表。
線段樹:勢能分析,每一個數被操做次數不會超過一個上限(通常是log次),不然暴力重構。可持久化就是沿用以前的節點,標記永久化。
線段樹合併:分爲可持久化和不可持久化兩種,常與sam/樹上問題嵌套。
線段樹分裂:相似非旋treap的寫法。把前k大和後k大分開。
貓樹:每一個區間預處理出左邊,右邊到中點的答案。查詢時直接O(1)找到對應節點(O(1)lca或二進制)而後O(1)查詢。
吉司機線段樹:區間對某個數取max。維護最小值,最小值個數和嚴格次小值。
樹狀數組:能夠一個log找第k大,維護前綴最值。值域小的時候甚至能切普通平衡樹。常與CDQ分治/總體二分嵌套。二維樹狀數組就是樹套樹。
左偏樹:可並堆,可以完爆普通手寫堆。記得跟線段樹同樣維護一個rt[],每次修改rt。能夠額外用一個並查集來維護根的編號。
splay:可以維護序列/數值集合。
非旋treap:能夠可持久化。
STL:set,multiset,map,priority_queue,vector,bitset。
並查集:可撤銷,可帶擴展域/帶邊權。
單調棧:用於各類神奇的發掘性質題,lis,DP優化當中。
樹套樹:用來處理二維信息。有時可用總體二分代替。
ST表:可優化連邊,可O(1)求區間最值,可用於O(1)lca。
鏈表:可維護一些O(1)插入刪除(必須按順序)的信息,有時會在莫隊中使用。
圖論:網絡流,tarjan,最短路,差分約束。
網絡流:主要是建圖,要加當前弧優化。
tarjan:求解連通性信息,多做爲一道題目的一部分。
差分約束:最大值求最短路,最小值求最長路。
字符串:hash,後綴自動機,AC自動機,manacher,KMP,迴文自動機,trie。
hash:雙模數,可平衡樹維護hash值。
後綴自動機:通常與線段樹合併結合,有時與lct結合,不少時候用fail樹轉成樹上問題。可用後綴樹構建sa。
AC自動機:每一個點都是一個前綴,跳fail是跳後綴。可與DP,矩陣快速冪結合。
manacher:O(1)求解以每一個位置爲中心的迴文串。
KMP:可改變第二次匹配時的匹配條件來作到一些奇怪的匹配。
迴文自動機:求解全部本質不一樣迴文串,每一個字符結尾的迴文串信息。
trie:可用01trie來處理異或,可持久化01trie來代替可持久化平衡樹。可建trie sam。
多項式:FFT,多項式操做,FWT。
FFT:可處理字符串匹配,卷積求方案,可與點分治結合。可用原根把*變成+作FFT。
多項式操做:多出現於計數題中。經常使用倍增與牛頓迭代。
FWT:位運算卷積。求子集和(高維前綴和)而後再差分回去。可優化子集DP(FST)
計算幾何:叉積,凸包,辛普森積分。
叉積:x1y2 - x2y1是有向面積。
凸包:左右橫着掃兩次。可用於斜率優化,可用set維護。
辛普森積分:分多段積分。精度要求是15eps,公式是(f[l]+4f[mid]+f[r])(r-l)/6。
DP:狀壓DP,區間DP,插頭DP,斯坦納樹,斜率優化,決策單調性優化,數位DP。
可按照大小依次DP。可把指望機率轉爲計數問題。可改變DP狀態與值的對應關係:f(x) = a -> f(a) = x。
狀壓DP:經常使用於打暴力,可分爲二進制/多進制狀壓,可預處理狀態集合。可壓輪廓線/點集,可DFS轉移一行/一格一格轉移。
區間DP:可多加一維狀態表示把當前變成什麼樣。
插頭DP:狀壓輪廓線上的左右插頭。
斯坦納樹:狀壓連通的關鍵點集,子集轉移以後spfa轉移。
斜率優化:發現DP的轉移代價有個乘積,維護凸包。可與CDQ分治結合。
決策單調性:分治寫法是[l, r]區間的最優決策所有來自於[L, R]。維護決策棧寫法是維護每一段決策分別是啥,以及段的結尾。
數位DP:預處理隨便選的方案數(記憶化搜索),而後枚舉在哪一位開始不嚴格相等。
計數:容斥原理,生成函數,組合數學,Min-Max容斥,二項式反演。
容斥原理:從剛好轉爲至少/至多。而後按照集合大小的奇偶性分配係數。有時候要減去算重的。可保證一路遞推來的全是合法的,而後減去。
生成函數:考慮待解決的問題本身跟本身的關係。連通->不連通是EGF exp。
組合數學:組合數,卡特蘭數,斯特林數等。
Min-Max容斥:求最值就是求全部子集的另外一個最值的和,配上正負1係數。集合大小爲1時係數爲1。對指望機率一樣有效。
二項式反演:若F(x) = ∑f(i),那麼f(x) = ∑C(x, i)F(i)。
數學:線性篩,杜教篩,BSGS,lucas,(ex)CRT,莫比烏斯反演,二次剩餘,矩陣乘法,高斯消元。
可O(logV)質因數分解(預處理)。
線性篩:O(n)篩積性函數。記錄每一個數的最小質因子和個數。
杜教篩:找個好求和的g跟f卷出來h,也好求和。通常是爲了把f的奇怪的項消掉來配g。
BSGS:預處理√phi(p)之內的放入hash表,而後每次跳√phi(p)步。
lucas:lucas(n, m) = lucas(n / p, m / p) * C(n % p, m % p)
CRT:考慮對其餘的模數無影響,每一個a乘上逆元便可。ex就是用擴歐解方程而後合併方程。三模數NTT的時候先對第三個模數取模而後對最終模數取模。
莫比烏斯反演:若F(x) = ∑f(d),則f(x) = ∑miu(d / x)F(d),常把gcd提早枚舉。
二次剩餘:w = a2 - n,sgn(x) = x(p - 1)/2。隨機a使sgn(w) = p-1,自定義單位負根爲√w,而後求解(a + w)(p + 1)/2。
其餘:CDQ分治,總體二分,分塊,啓發式合併/分治,線段樹分治,(樹上)(帶修)(回滾)莫隊,二(三)分,帶權二分,掃描線,01分數規劃,倍增,時光倒流,隨機化,搜索,模擬,貪心,博弈論,模擬費用流。
CDQ分治:先DP完左邊而後更新右邊。可優化DP,樹上與點分治結合。可嵌套。
總體二分:一般求解第k大,有個特殊的應用是求解一條邊在scc中的時間。內部可嵌套各類東西,好比虛樹,樹套樹。
分塊:可維護序列,或者對出現次數,數值的大小,時間分塊等。時間分塊按期重建能夠優化成二進制分組。
啓發式合併:每次暴力遍歷小的集合。
啓發式分治:包括最值分治。每次花費的時間爲小的集合那一部分的時間。能夠巧妙的改變枚舉順序。
線段樹分治:把加,刪操做變成只有加的操做。內部仍是嵌套各類可撤銷數據結構。
莫隊:對詢問分塊。樹上:括號序列。每一個點重複計算時減去貢獻,分類討論。帶修:第三個指針在時間上跳動。回滾:使用可撤銷數據結構作到只有刪除/插入。
二分:直接暴力二分答案,而後check。很是經常使用!很是經常使用!
帶權二分:要使D的變化和你的值的變化相同,而後儘可能取k小的那個。感性證實(打表)凸函數。
掃描線:把二維限制轉換爲二維平面上的信息,而後掃描線。
01分數規劃:二分答案而後check。
倍增:常在樹上使用。應用普遍。
時光倒流:倒着處理會好受一些。
隨機化:隨機化check是否合法/隨機化排列以達到指望複雜度/隨機化貪心。
搜索:優先搜分支少的/最優的。
模擬:注意各類細節。
貪心:可經過微調來證實。
博弈論:sg函數。多找規律。
模擬費用流:先貪心,用堆來模擬反悔操做。