- 數組開小。很容易 \(2 \times 10^5\) 或 \(10^6\) 就開成 \(10^5\),或者各種變量的數據范圍混用,\(m \leq 5\times 10^5\),結果只開到了 \(n\) 的數據范圍 \(10^3\)。(upd. 2020.8.31),upd 2021.2.6 又犯了一次。
- 多測不清空。算法中要用到 \(a[n+1]\) 結果只手動清到了 \(n\)。(upd. 2020.8.10)當然有的時候多測是修改一部分值,如 CSP-S 2020 T4,遇到這種情況就要檢查每次詢問結束 \(a\) 數組是否還原到了詢問前的樣子(upd. 2020.11.8)upd 2021.2.16 又犯了一次
- 忽略了一些比較隱蔽的條件。例如 APIO2020 T1 一開始忽視了 \(\sum f(k)^2 \leq 4\times 10^5\) 這個條件,以為是給部分分用的,結果就一直在想 \(n \log n\) 級別的算法,浪費了很多時間,事實上這隱含着 \(f(k) \leq \sqrt{4\times 10^5}\) 的條件。(upd. 2020.8.15)
- 把題目中的 \(a\) 與 \(b\),\(n\) 與 \(m\) 的含義搞反了,或者沒看清讀入順序,明明是先 \(m\) 后 \(n\),讀成了先 \(n\) 后 \(m\)。(upd. 2020.10.6)
- 寫了個錯誤的程序對拍(upd. 2020.10.6)
- 碰到那種二維平面的題,“格子”與“格點”,以及坐標軸的方向搞錯了。(upd. 2020.10.14)
- 想出了一些復雜度較高卻又沒啥辦法優化的 dp 式子,然后就一直盯着它進行優化,可有時這種題偏偏不是 dp(upd. 2020.10.15)
- %lld 寫成了 %d(upd. 2020.10.19)
- 二分上界開小了(upd. 2020.10.19)
- 注意 0 沒有逆元,有的時候計數 dp 用到除法(除以另一個 dp 值)那基本上不太行的(upd. 2020.10.19)upd. 2021.7.6 其實是可以的,按照 SDOI 切樹游戲 的套路來搞即可
- 考試最開始沒有花時間把每道題都瀏覽一遍,導致有時候最后一題反而能拿些分的卻沒拿到。(upd. 2020.10.22)
- 沒有對拍,或者對拍浪費了很多時間,導致該拿的分沒拿到。最后與自己的預期相差甚遠。(upd. 2020.11.1)
- 手寫隊列、棧等時以及莫隊中,++ / -- 是前置還是后置要想清楚。(upd 2020.11.17)
- 多測的時候,有時候讀到一部分數據就可以確定答案了,但此時你不能直接 continue,要把全部數據讀完(upd. 2020.12.11)upd. 2021.10.21 差點又犯了一次,還好最后腦子比較清醒想了起來(
- 有的時候,值域 \(\leq 10^9\),而模數只有 \(998244353\),此時你就不能用直接加,大於 \(mod\) 就減去 \(mod\) 的方式取模(upd. 2021.1.12,這個是 csy 跟我講的)
- 有時候點標號從 \(0\) 開始,進而會習慣性的 \(+1\),即
int u,v,w;scanf("%d%d%d",&u,&v,&w);u++;v++;
。結果把u++;v++
寫到了scanf("%d%d%d",&u,&v,&w);
的前面。(upd. 2021.1.31) queue
忘pop
(upd. 2021.1.31),upd. 2021.2.18 又犯了一次,upd. 2021.6.28 梅開三度pw10,hash,pipe
在 linux 下是關鍵字,但在 windows 下測不出來,要格外注意(upd. 2021.1.31)- 內外層循環變量名取重了。這種情況即使開 -Wall 也測不出來(upd. 2021.1.31)upd. 2021.4.7 開 -Wshadow 似乎可以測出來
- 莫隊記得先
push
再pop
,不然可能會出現一些奇怪的問題(upd. 2021.2.1) - 有的時候數組有用的下標不會越界,但可能會用到越界的下標,即使這些越界的下標沒有用也要記得把數組開大,否則會出現一些奇怪的問題。(upd. 2021.2.1)(upd on 2021.10.22,有時侯比較明顯的下標越界編譯器會提示出來,譬如如果你循環到 2e5 數組只開了 1e5+5 它就會顯示 iteration 100005u invokes undefined behavior)
- 讀入中的變量名可能跟循環中的變量名重復(譬如 \(k,d\) 等)(upd. 2021.2.2)注:2021.2.6 又犯了一次該錯誤,線段樹遞歸時的 \(k\) 與讀入的 \(k\) 重復了。upd. 2021.4.7 開 -Wshadow 似乎可以測出來
- 要特別注意運算過程中爆 int 的情況,譬如如果 \(a\) 為 long long 型變量,\(b,c\) 為 int 型變量,那么如果你寫
a*(b*c)
那么程序會先計算b*c
的值,就有爆 int 的風險。(upd. 2021.2.3) - 遇到與網格有關的題的時候,要特別注意是四連通還是八連通(upd. 2021.2.4)
- 冰茶姬忘了初始化(tips:如果實在忘記可以寫
int find(int x){return (!f[x])?x:find(f[x]);}
)(upd. 2021.2.6) - 可撤銷冰茶姬千萬不能路徑壓縮(upd. 2021.2.6)upd. 2021.10.22 打線段樹分治模板時又犯了一次(
- static 關鍵字修飾的變量與全局變量的唯一區別就是 static 關鍵字修飾的變量不能在局部域之外的地方被調用,否則會 CE。故如果你用 static 修飾的變量當作臨時備份那么它在接下來幾輪的遞歸中也會被修改,進而會導致 WA。(upd. 2021.2.7)
- 可撤銷冰茶姬按秩合並的“秩”是深度,而不是樹的大小,按大小來合並的叫“啟發式合並”(upd. 2021.2.7)
- 有時候做計數題的時候要我們對 \(p\) 取模,有時候我們會特判掉一些情況(比如說 \(2\)),但你不能直接
puts("2");
,要printf("%d\n",2%p);
,經常有時候會有毒瘤出題人專門卡這個。(upd. 2021.2.15) - 三個 <998244353 的數加起來會爆 int(upd. 2021.2.16)
- (其實是 30 的擴展),有的時候計數題會寫
ans=(ans-sum+MOD)%MOD;
,然后你發現自己式子推錯了,不是減而是加,此時你不能只習慣性地把減號改成加號,而應當把后面的+MOD
去掉,因為三個 <998244353 的數加起來會爆 int(upd. 2021.2.16)upd. 2021.10.21 又犯了一次 - 把模數看錯,1e9+7 看成 998244353(upd. 2021.2.16)upd. 2021.5.1 又犯了一次
- 當把一個數組賦上 -INF 時,以前習慣寫
memset(dp,128,sizeof(dp));
,但實際上這樣是不明智的,因為 0x8080808080808080 大約是 \(-9\times 10^{18}\),兩個 0x8080808080808080 加起來會爆 ll。所以最好寫memset(dp,192,sizeof(dp));
,這樣兩個加起來不會爆。同樣道理最好也不要寫memset(dp,127,sizeof(dp));
而改寫memset(dp,63,sizeof(dp));
(upd. 2021.2.18) - 當你忘記運算符的優先級時最好多加幾個括號,這樣不會吃虧(upd. 2021.2.19)
- 敲 SA 的時候,數組長度有的時候不是 \(n\)(長度變量名為 \(m,k\) 或其它的),但總習慣性地敲成 \(n\)(upd. 2021.2.22)
- 變量類型一定要注意,不要出現
int
開成double
的情況,否則可能會讓你調到懷疑人生(upd. 2021.3.13) - set 上定義的 "<" 一定要是嚴格偏序關系,也就是必須滿足傳遞性,必須不滿足自反性,否則可能會出問題。(upd. 2021.3.13)sort 里的 cmp 函數也是如此(upd. 2021.8.16)
- 當 \(x\) 超過
int
范圍時,調用builtin_popcount
會出問題,需調用builtin_popcountll
(upd. 2021.3.15) - 對於結構體中含數組的,一定要記得手寫構造函數清空數組,否則會出現奇怪的問題(upd. 2021.3.26)
- 對於字符串長度,比如說讀入長度為 \(3\) 的字符串,數組長度千萬不能只開到 \(3\),一定至少開到 \(4\),因為程序讀入字符串后會自動在后一個位置填上
\0
,如果只開到 \(3\) 會導致數組越界(upd. 2021.3.26) - (其實也不能叫 mistake?)在 C++11 下交換兩個 STL 是 \(\mathcal O(1)\),不開 C++11 下交換兩個 STL 是 \(\mathcal O(\max(\text{STL 大小}))\) 的,這一點需注意(upd. 2021.3.27)
- 在寫網絡流的時候,一定要算好網絡流的邊數和點數的規模,不要隨隨便便地就將
MAXV
和MAXE
設為一個“感覺比較大”的值,比方說 2e5,這樣有可能會 RE(upd. 2021.3.31) - 注意浮點數誤差,碰到 double 的比較運算時,最好不要直接用
!= == < >
什么的,寫個 EPS 比較大小(upd. 2021.4.1) - 帶修莫隊時間軸那一維指針,記得先更新貢獻再移動指針(upd. 2021.4.1)
- IDFT 完后數組中的元素不要忘除以 \(n\)(upd. 2021.4.2)
- 在進行多項式 EXP 時一定要保證常數項為 0,否則會出現奇怪的問題(upd. 2021.4.2)
- 寫矩陣乘法的時候一定要注意乘法的順序(upd. 2021.4.5)
- 一定一定要看清楚部分分的數據范圍,subtask 判斷是否在數據范圍內時不要判錯(聯合省選 2021 D2T3,upd. 2021.4.11)
- data 在 C++17 上是關鍵字,在 OJ 上提交時需注意(upd. 2021.4.23)
- 如果模數是 \(2\times 10^9\) 級別的,要注意加法溢出的可能性!!!!!(upd. 2021.4.24)
- 求 SCC 彈棧時一定要把對應節點的
vis
設為 \(0\)!!!111(upd. 2021.4.30) - 在二分 check 的過程中忘了清空(upd. 2021.5.8)
- 注意
set
的迭代器失效問題,具體可見這里(upd. on 2021.5.13)(upd. on 2021.6.30) - 對於那些瀕臨爆溢出的數,比方說 \(2000\) 個 \(10^6\) 級別的數相加(\(2\times 10^9\)),也要注意爆 ll 的可能性(upd. 2021.6.25,vp edu 89)
- 注意運算符優先級!(upd. 2021.6.30)
- 寫 wqs 二分時注意斜率有可能為負,因此二分下界不能想當然地設為 \(0\)(upd. 2021.7.13)
- 注意
int
型變量不要錯誤地開成bool
(u1s1 感覺int
嚴格強於bool
?)(upd. 2021.7.29) - HDU 上 long double 不要 printf(其實大概不算 mistake,大概算 HDU 的 feature)(upd. 2021.8.10)
- 離散化不能只 sort,記得 unique,也要記得要在 unique 后的數組中 lower_bound(upd. 2021.8.11)
- 對於一個
int
型變量 \(x\),如果我們設了一個int
型的標記變量flg
,flg=1
當且僅當所有 \(x\) 都 \(\ne 0\),那么如果你寫flg&=(x)
就涼透了,要寫flg&=(x!=0)
(upd. 2021.8.11) - 有時候我們會用 \(0\) 表示空,但如果數的值域就包含 \(0\) 就不能用 \(0\) 了,得用 \(-1\),如果還包含 \(-1\) 就得用 \(\infty\)(upd. 2021.8.13)
- !!! 如果比賽不開 C++11,提交前記得檢查是否有 C++98 禁止的東西,點名
vector<vector<int>>
、for(int x:g[u])
、[&](int x,int y){return dfn[x]<dfn[y];}
!!!!!(upd. 2021.8.22) - (大概也不能算 mistake)倍增把小的那一維放在前面會快不少(upd. 2021.9.29)
- LCT 一定要記得
pushdown
啊!!!!!!!(upd. 2021.10.11) unordered_map
空間常數很大,對於部分空間限制較小的題,使用unordered_map
有可能會導致 MLE(upd. 2021.10.22)- STL 的
size()
返回的是 unsigned,如果你那一個signed
減去一個unsigned
結果可能會溢出,這點需特別注意(upd. 2021.11.5)