在本博客中,一般寫題解的題都是我認為比較有價值的題,然而我還做過一些有一定價值,但並沒有達到值得寫一篇題解的程度,故將這些題目總結出的套路用一句話概括在這里:
當然如果看到我太久不更請在評論區里催我一下
- 計數題里碰到平方可以嘗試把它們拆成 每對符合要求元素各自產生貢獻(upd on 2021.9.13,CF1187F)
- 概率題一定要注意隨機變量是否獨立,只有它們獨立它們的貢獻才能直接相乘(upd on 2021.9.13,CF1187F)
- 看到序列上的線性變換(指操作可以寫成線性變換的形式)可以嘗試用線段樹維護矩陣乘法維護,如果涉及常數那么矩陣上可以額外維護一個常數維存儲這些常量(upd on 2021.9.14,P7453)
- 看到 \(c_i\leftarrow c_{i-1}+c_{i+1}-c_i\) 這種形式的東西,應知道這東西等價於對 \(c_i-c_{i-1}\) 的置換(upd on 2021.9.15,CF1110E)
- 看到要求 \(x-y=v\) 的數的對數,並且值域不算太大,可以想到差卷積(upd on 2021.9.15,P3760)
- 對於某些數論中的題目,關於質因子的狀壓可以轉化為原數的約數,因為每個數的質因子組成的集合本身就可以表示一個狀態(不過一般狀壓質因子復雜度也可以被證明是調和級數或者類似的東西?)(upd on 2021.9.18,NFLSOJ 12429)
- 有的最優化問題有時也可以轉化為計數問題,通過模上一個或幾個大質數並判斷余數是否為 0 來求解(upd on 2021.9.18,NFLSOJ 12429)
unordered_map
常數大約是數組的兩倍,所以以后狀壓 dp 之類的題目能刪減狀態就刪減狀態(upd on 2021.9.19,NFLSOJ 10131)- 對於質數 \(p\),必然有 \(\forall n\ge p,n!\bmod p=0\),利用這個性質可以使得很多 \(n\) 很大(比方說 \(10^{18}\))的情況變成詐騙題(upd on 2021.9.19,NFLSOJ 10131)
- 分塊打表有時是一個不錯的技巧(upd on 2021.9.19,NFLSOJ 10131)
- 看到斜率優化的形式的式子要想起來是斜率優化啊!!!(upd on 2021.9.20,CF643C)
- 對於 \(\sum\limits_{i=1}^ma_i=n\) 的數列 \(a\),其中包含的不同數的個數只有 \(\mathcal O(\sqrt{n})\) 種(upd on 2021.9.21,CF1574F,利用這個性質可以不用分治 FFT/求逆)
- 線段樹維護信息的本質是合並兩個區間的信息,因此如果發現一些信息滿足可合並性(如鏈上的一些信息,或者一些有關樹的直徑/虛樹的信息),可以想到線段樹(upd on 2021.9.21,CF1083C)
- 一個數 \(\bmod\) 完一個比它小的數后大小減半,這有時是一個非常重要的性質(upd on 2021.9.21,AGC003E)
- two pointers 是均攤數據結構(霧),不支持撤銷(upd on 2021.9.21,NFLSOJ 12430)
- 矩陣乘法可以通過“先枚舉 \(i,k\) 再枚舉 \(j\),並且當 \(k\bmod 16=0\) 時再取模”的套路減少取模常數(upd on 2021.9.22,NFLSOJ 10127)
- 對於矩陣乘法的題目,能把矩陣改成向量就改成向量,減少常數(upd on 2021.9.23,NFLSOJ 10127)
- 刪除操作非常棘手,不妨考慮線段樹分治(upd on 2021.9.24,CF678F),也可以倒立(
- 看到保證最短路徑的前提下,求 xxx 的最值/計數的問題可以考慮建出最短路徑 DAG,這樣最短路徑可以轉化為最短路徑 DAG 上的路徑(upd on 2021.9.25,LOJ 2769)
- 區間 DP 的轉移一般可以考慮“最后一次進行的操作”,然后將序列分成兩個部分並計算貢獻(upd on 2021.9.26,P4766)
- 看到“每個點的度數 \(\ge k\) 的題目”可以考慮按將所有點及其度壓入一個
set
中並動態刪點(upd on 2021.9.28,NFLSOJ 12448) - 在構造題中看到下取整可以往抽屜原理的方向思考(upd on 2021.9.28,CF1450C2)
- 碰到 LIS/LDS 的題目不要只拘泥地想“\(dp_i\) 表示 \(i\) 結尾的 LIS/LDS 的最長長度”,也可以交換定義域&值域,變成“長度為 \(i\) 的 LDS/LIS 的最大/小結尾元素”(upd on 2021.9.28,NFLSOJ 12449)
- 樹剖求 LCA 常數非常小,\(\log n\) 跑起來和 \(\mathcal O(1)\) 差不多快,不過會被滿二叉樹卡(upd on 2021.9.29,NFLSOJ 12456)
- 碰到從開頭刪除/結尾插入,全局插入,並且合並復雜度很高,但插入復雜度不高的題目,可以考慮雙棧模擬隊列(upd on 2021.9.29,NFLSOJ 12458)
- 使用莫隊二次離線可以將一些 \(n\sqrt{n}\log n\) 將為 \(n\sqrt{n}\)。(upd on 2021.10.1,NFLSOJ 10175)
- 看到 DAG 的計數可以想到枚舉度為 0 的點然后容斥(upd on 2021.10.4,洛谷 P6295,更多 trick 可見那題題解)
- 有的概率題會讓你保留成小數形式 instead of 取模,這時候你就可以考慮重復某個過程直到精度符合要求 instead of 推無窮級數(upd on 2021.10.4,CF623D)
- 對於計數題,如果發現等價表達不太好找,可以嘗試容斥(upd on 2021.10.11,NFLSOJ 12473)
- 對於一些帶修的數據結構題,可以考慮離線掃描線並以時間為下標(upd on 2021.10.15,NFLSOJ 12461)
- 對於區間查詢所有還活着的位置並將這些活着的位置全部刪去的模型,可以考慮使用並查集維護,這樣可以做到 \(\Theta O(n\alpha(n))\)(upd on 2021.11.2,NFLSOJ 12554)