sb 錯誤


upd. 2020.11.29:今天剛想刪了轉到本地但是被評論感動了(

讓帶家見識一下我的 sb 程度((

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM