- excrt合併模線性方程的時候,解不定方程獲得的$x$,必定要弄小,不然容易在乘的過程當中炸掉long long
- 線性基取最大異或和的時候不必定包含全部基向量,而是回代後,全部數的異或和。
- 數組必定不能開小。讀寫未被分配的內存會發生奇怪的事情。好比在I/O中莫名奇妙Runtime Error
- signed 是 signed int 的簡寫。
- dinic的dfs中, (f = dfs(eu, min(minf, g[i].cap - g[i].f)) > 0) 是錯誤寫法,正確的寫法應該加上一組括號 ((f = dfs(eu, min(minf, g[i].cap - g[i].f))) > 0)
- 要分清 for 的是$n$仍是$m$。
- memset 一個 boolean 數組不要寫成 sizeof(int)
- 進考場的時候必定要覈對機子的時間是否正確。被坑1小時的慘痛教訓。
- 對負數進行「質因數」分解時注意絕對值。
- 線性基回代的時先處理低位。
- 二分的時候邊界必定不要小了
- OJ上交題注意不要交錯程序
- 後綴自動機的空間要開兩倍
- OI賽制記得跑極限數據檢查邊界問題。
- 倍增取路徑上的信息的時候,最終的向上跳的一步記得是拿兩條邊更新。
- 歐拉回路不必定通過全部點,而是全部邊。
- 作完一題拍一題。 100 >= 100 * Math.random() (暴力很差寫除外,但要用特殊數據檢驗。因此NOIP 3個半小時可難了)
- 對拍時記得 srand((unsigned) time (NULL))
- 考場上不要理會別人敲代碼的聲音,僞裝他們都在敲假算法,會爆零。(雖然實際上他們可能ak了)
- 多項式求逆元兩倍空間,多項式開根兩倍空間。
- 多項式開根,求逆前記得清空數組
- 多項式開根,在求模$x^{n}$的意義下求逆元。
- 多項式操操做記得清數組,確保不會掛掉
- 動態插入凸包不能求最遠點對
- 題讀三遍,樣例仔細看
- Splay每一個操做完成後檢查是否執行splay操做,確保均攤沒有假掉。
- 注意LCT的link操做的時候不要鏈接反了了,被makeroot的那個點連向另外一點
- pushDown時更新標記的狀況下,上傳的時候注意左右子樹的標記有沒有清掉
- 記得跑極限數據檢查邊界、常數、時間複雜度是否假掉、空間。
- 常備份源代碼。
- 有$n$個點,不意味着暴力枚舉與一個點相鄰的點至多會枚舉到$n - 1$個點。
- 須要分配標號時,$p_l p_r$須要考慮總方案數是否被正確計算。
- Tarjan的$low$不能亂改。
- NTT注意模數的兩個地方:
- 是否存在原根
- $\varphi(p)$的2倍數的因子是否足夠大
- 很是降智的錯誤↓
1 template <const int Mod = :: Mod> 2 class Z { 3 public: 4 int v; 5 6 Z() : v(0) { } 7 Z(int x) : v(x){ } 8 Z(ll x) : v(x % Mod) { } 9 10 Z operator + (Z b) { 11 return Z(((v += b.v) >= Mod) ? (v - Mod) : (v)); 12 } 13 Z operator - (Z b) { 14 return Z(((v -= b.v) < 0) ? (v + Mod) : (v)); 15 } 16 Z operator * (Z b) { 17 return Z(v * 1ll * b.v); 18 } 19 Z operator ~() { 20 return inv(v, Mod); 21 } 22 Z operator - () { 23 return Z(0) - *this; 24 } 25 };
- 左移和右移運算中,偏移量不要超過位數-1.
- 樹鏈剖分求lca比較的是鏈頂的深度
- 當方點只維護其兒子的信息時,主要它的父節點的信息。
- 分清有向邊和無向邊。
- 請手動類型檢查:
#include <bits/stdc++.h> using namespace std; typedef bool boolean; multiset<int> S; int main() { // ...... S.upper_bound(1000000000000ll); return 0; }
- 最小生成環套樹森林的並查集正確判斷方法:
boolean check(int x, int y) { x = find(x), y = find(y); if (req == 1) return x ^ y; return !cir[x] || !cir[y]; }
- 建凸包要以縱座標爲第二關鍵字排序。