務虛
-
注意觀察題目中的性質,每一條性質都不是沒用的,都可能是問題的突破口
-
長的閱讀理解題,一定要耐着性子讀完,提取主干,也不要忽略細節
-
一定要記得靜態查錯!!有的時候花費數小時調的錯誤,很可能幾分鍾的靜態查錯就能解決
WA
-
取模優化/int取模
1ll*a+b
,no 括號 -
memset 不能亂用,如果你的 sizeof 寫錯了, 可能會爆出隨機數
-
記得把
INF
設到足夠大 -
記得 時刻取模 ,有減法時記得先
+mod
再%mod
, 如果有必要需要讀入后 立即取模 -
不要 盲目取模 ,尤其是計算 過程中 胡亂取模會 影響正確性 ,算完后最后 結果可以取模
-
注意 模數性質 ,是否為質數,數清楚有多少位,不要想當然
-
在 需要取模的快速冪 中,如果最后的 結果為
0
記得加上一個mod
,否則會出錯 -
在 快速冪 中, 傳參數記得類型 為
long long
否則可能會 爆long long
-
重載運算符 時要注意,
this.a<t.a
才是從小到大 -
-
指數不能直接取模!
-
快讀時記得處理負數
-
樹剖時記得分清楚第\(i\)個原數權值(
w
),和按dfn
順序的權值(nw
) -
線段樹
update
或pushup
或pushdown
時,不能僅更新sum
,應該更新全部信息,如min
、max
等 -
在 splay 的標記下傳過程中,一定要先判斷左右兒子是否存在,再對其翻轉標記異或 \(1\)
-
Floyd算法枚舉順序:
k,i,j
-
左移或右移的優先級比 \(+\) 或 \(-\) 的低,
&&
比||
的優先級高 -
左右移位默認的類型是
int
, 記得轉換成long long
再計算 -
\(1\) 默認類型是
int
, 運算時記得轉換為1.0
或1ll
-
矩陣快速冪時
res
矩陣記得初始化, 使對角線為 \(1\) -
移位的時候記得注意數據范圍,不要
-1>>1
-
輸出
float double
時最好用printf("%f");
,而不是long double
的printf("%lf");
RE
-
開桶小心訪問負下標!!
-
線段樹開4倍空間
-
線段樹
pushdown
時記得特判是否為葉子 -
DFS是樹根的父親盡量不要設成\(-1\),因為
fa[root]
可能會在LCA中用到導致RE
-
樹狀數組記得特判
0
的情況 -
分塊時,最后塊后面還要加一個右端點為
n+1
的塊 -
n,m
的范圍不代表數據范圍 -
用
ios::sync_with_stdio(false)
后不要用scanf -
多組數據重新建邊的時候記得清空 \(idx\)
-
更改了 \(\rm set\) 中元素后,小心迭代器 RE
-
\(\rm set\) 小心邊界,判
s.begin()
和s.end()
-
TLE
-
不要隨便用SPFA,看清題目要求,是否有負邊權,是否是雙向邊,是否稠密或稀疏等
-
存圖時記得初始化
memset(h,-1,sizeof(h))
-
沒事別用
unordered_map
,穩定 \({\rm O}(n)\) 警告 -
矩陣乘法循環順序:
i,k,j
或者k,i,j
-
在 dfs 中的各種奇怪錯誤可能是由某個你不希望在下次搜索被更改的量, 被改動了, 因此一定要注意自己變量的作用域
-
刪除的時候要考慮鏈表優化,跳過沒用的(已經刪除的)!
-
\(\rm SPFA\) 判斷負環的時候只需要判當前路徑長度是否大於 \(n\)
CE
-
命名時避開
x1,y1,x2,y2
這些系統關鍵字 -
切忌用
int a[10000000]={0};
初始化大數組,否則會因為編譯文件過大暴死
UB
-
int
類型的函數無返回值 -
訪問負下標
-
編譯選項開
-Wall
有助於避免UB
-
-fsanitize=address, -fsanitize=signed-integer-overflow
這些選項對UB
和RE
的排查都有幫助
高效做題
-
在遇到和逆元有關的題目時(比如求概率或期望),可以寫一份轉成
double
的副本,可以提高調試效率 -
寫了
init
就要初始化,別忘了用 -
模數為\(0\)或者除數為\(0\)都可能導致
RE