upd. 2020.11.29:今天剛想刪了轉到本地但是被評論感動了(
讓帶家見識一下我的 sb 程度((
- 判斷形如 \(a\cdot b+c(c\ll a\cdot b)\) 是否爆
int
/long long
時,不能只判斷 \(a\cdot b\),要判斷 \(a\cdot b+c\),因為 \(c\) 有可能是壓死駱駝的最后一根稻草。 - 線段樹節點要維護一大堆東西的時候,通常查詢時返回節點,此時空節點與非空節點合並時不能想當然,要特判。
set
/map
等高級的 STL 容器一般很耗內存,ML 小的時候注意會不會爆,爆的話改成自己寫的簡單一點的 DS。- 不能因為答案在
long long
范圍內就忘取模;模數不能抄錯,如 \(10^9+7\) 抄成 \(998244353\) 或 \(10^9+9\)。 - 一大堆
min
/max
/abs
時括號位置不能矬,可以用高亮檢查。 - 不要胡亂將整型塞進有關 \(\log\) 的浮點函數里,可能會玄學爆精度。
- 維護一堆操作的題,如果維護的時候需要用到操作數 \(qu\),那么不能
while(qu--)
而要for(int i=1;i<=qu;i++)
。 - 若 \(it\) 是一個指針,要將它位移 \(a-b\) 位的話,要寫
it+(a-b)
而非it+a-b
,那樣可能會越界。 - 盡量不要將多個相關的函數寫進一個表達式里,這樣運算順序可能是 UB。
- 把
continue
寫成break
/return
。 - 平衡樹里上傳時要更新
sz
而不能只顧更新其他信息。 - 看清楚數據范圍,不要因為 \(n,q\) 同階就認為它們相等,代碼中寫錯變量上限而數組開小會 RE;或未注意到根據題意,數組大小應該是 \(2n\) 或其他關於變量上限的式子,而直接寫變量上限。
- 多測
memset
,爆零兩行淚。 - 網格上的題要看清楚給定的是頂點坐標還是格子坐標。
- 開數組的時候把各數據范圍弄混,如將
int a[N+1];
寫成int a[X+1];
。 - 前綴和預處理時如果
i=0
則不能調用Sum[i-1]
,可以手動平移一位或特判;同時注意調用前綴和時的越界問題(理論上越界合法,值為 \(0\))。 - 快讀不能忘了可能會有負數。
- 如果想退出多重循環,一個
break;
是不行的,只能退出一層。 - 如果算法要求某個數組有序,而且這個數組靠直覺看也應該是本身就是有序的,但是題目可能偏偏不保證有序,而樣例卻又都是有序的。這時需要排序。
- two-pointers 的時候,如果要對某個數組從大到小掃,那么「將此數組從大到小排序」和「從后往前掃」中只能恰好選一個,如果兩個都選就負負得正了。
- 手寫隊列、棧等時,
head
/tail
/top
的++
/--
是前置還是后置要想清楚。 - \(0\) 沒有逆元。講大一點就是如果一個運算有或沒有逆運算那還好說,如果在值域里面有些值可逆,有些值不可逆,那就要當心了。
- 多測清空的最終目的是讓每一次跑都如同第一次一樣。有的時候光清空解決不了問題,比如下一個點依賴於上一個點的某些數據,而你卻把它修改了,這時要還原。所以要把
//remember to clear
改成//remember to make it first
。 - 注意極端數據(邊界)。
- 循環變量重復定義(
-Wall
也不會提醒),可能導致看似的靈異事件。比如處在一個很大的for(i)
里面而忘記這層大循環,在里面循環變量也從i
開始。 - 忘判無解。
- 帶有減法和取模的題,最終不能忘了把答案轉成非負數。
min
/max
的兩個參數類型千萬不能不相同,可能在某些編譯器下通過,但在最終評測編譯器下就會悲慘的 CE。- \(n,m/h,w\) 混淆。
- 單調隊列最好先
push
再pop
,否則可能新加進來需要被pop
的元素。 - 邏輯運算符 & 位運算符優先級。
- 盡管離散化后值域大小等於 \(n\),但如果中途改變了 \(n\),值域大小可就不再等於 \(n\) 了。
- 有時候循環內部調用
a[i-1]
並且循環從 \(1\) 開始,這時候雖然大多數時候因為a[0]=0
不會有問題,但有的時候就是會沖突,不能欠考慮。 - 下標從 \(0\) 開始還是從 \(1\) 開始?
- 中間結果爆
ll
而輸入輸出不會爆。 - 一個待輸入變量還沒輸入就調用。
- 全局變量和局部變量重名,不會報錯,但是會調到懷疑人生。(和第 25 條原理相似)
- 初始化函數寫了一定要調用啊………………
1<<x
中若 \(x>31\) 會爆int
,要寫1ll<<x
。- 通常對值域為 \(\N_+\) 的東西,會使用零值來表示沒有值。但有的時候值域為 \(\N\),這時候用 \(0\) 就會出現錯誤,需要用 \(-1\)。甚至有的時候值域會是 \(\Z\),這時候要用 \(\infty\)。
- 離散化忘記
unique
,只sort
,這樣正確性沒影響,但是數據一大就會 T。 - 浮點轉整型以及整型下的除法都是向零取整,如果想要下取整要分類討論,如
toint
函數應該寫int(x+sgn(x)*.5)
instead ofint(x+.5)
。 - 負值跟某些我們希望是
signed
的unsigned
(如v.size()
)作比較會自動轉成unsigned
而出錯,這時應該把式子里所有unsigned
都強轉成signed
。