【隨筆】oier錯(cuò)誤合集
(轉(zhuǎn)發(fā)一下我在某網(wǎng)站寫的博客)
養(yǎng)成良好的代碼習(xí)慣,從我做起。
閑來無事,開個(gè)新坑。點(diǎn)個(gè)贊吧親~
也算是在我退役之前留下一些對(duì)后人有意義的東西了。
本博客記載一些比較通用的容易寫掛的屑細(xì)節(jié)。
編譯選項(xiàng)加 -fsanitize=undefined -Wextra -Wall 有效避免大部分錯(cuò)誤。
TLE
- 多組數(shù)據(jù)不限組數(shù)只限制 \(\sum n\),卻使用了
memset清空。 - 沒寫快讀,甚至使用不關(guān)閉流同步的
cin讀入。 - 沒刪
cerr或者fprintf(stderr)等調(diào)試語句。 for(int i = n ; i >= 1 ; ++i)
for(int i = 1 ; i <= n ; ++i)
for(int j = 1 ; j <= n ; ++i)
// do sth
- 交互題要記得
cout << flush或fflush(stdout)。(感謝 WYXkk) - dfs 沒判斷 fa 無限遞歸(當(dāng)然最后有可能會(huì) RE、MLE)。(感謝 lndjy)
- bfs 隊(duì)列不 pop。 (感謝 abruce)
- Dijkstra 堆建成大根堆。 (感謝 maruize)
- ……
WA
- 如果多組數(shù)據(jù)交換兩組數(shù)據(jù)的位置得到答案不一樣:多測(cè)不清空,爆零兩行淚。
- 數(shù)據(jù)類型:
- 你的函數(shù)傳參有混用
int、long long、double各種類型嗎? - 你可能是被卡精度了,請(qǐng)減少浮點(diǎn)數(shù)的使用。
- 說到浮點(diǎn)數(shù),你有寫
eps嗎?或者說你定的eps是否合適?(有的時(shí)候eps過小也是會(huì)出問題的) - 你是不是浮點(diǎn)數(shù)運(yùn)算輸出了
-0.000000。 - 浮點(diǎn)運(yùn)算算出了
nan或者inf。
- 你的函數(shù)傳參有混用
- 最大最小值:
- 最大值設(shè)成了
0x3f。 - 最大值不夠大。
- 10000000007,1 << 62。
- 最小值設(shè)成了
0,(答案有可能是負(fù)數(shù))。
- 最大值設(shè)成了
- 快讀你讀入了負(fù)數(shù)嗎?
- 快讀你
return了個(gè)啥玩意,別告訴我return 0了。 - 沒刪調(diào)試語句。
- 你到底運(yùn)行了自己的初始化函數(shù)沒有……
- 你的數(shù)據(jù)分治的判斷部分到底寫對(duì)了沒有……
- 你的變量重名了嗎(尤其是與全局變量撞了)?
- 注意輸出格式,是空格還是換行;多組數(shù)據(jù)之間是否要額外換行?
- 請(qǐng)注意 Windows 系統(tǒng)與 Linux 系統(tǒng)下
rand()值域的顯著差異。 - 滾動(dòng)數(shù)組和刷表法連用你清空了上一輪的的 dp 值嗎?
- 多項(xiàng)式全家桶一定要記得清空數(shù)組啊啊啊啊啊啊啊啊啊啊!!!!!!
- 求求你了,NTT/FFT 的時(shí)候千萬別
swap(i ,rev[i]); - 請(qǐng)注意 dfs 時(shí)在棧中和已訪問不是一個(gè)東西。
- 矩陣樹定理,行列式交換要乘
-1。 - 取模
- 隨手不取模,爆零兩行淚。
- 兩個(gè) int 乘爆了
- 三個(gè) long long 乘爆了
- 負(fù)數(shù)忘記取模后 +p 再模 p 了
- 注意對(duì)指數(shù)的取模是 \(\bmod\ \varphi(p)\)。
- 拓展歐拉定理的指數(shù)取模還要加上 phi(p),不加這個(gè)你就沒了。 (感謝 Karry5307)
- 隨手不取模,爆零兩行淚。
- UB:
- 如果同一組數(shù)據(jù)運(yùn)行兩次答案不一樣:檢查是否出現(xiàn) UB。
- UB:
s[read()].push_back(read())。 (感謝 RedreamMer) - 不要讓賦值左右同時(shí)出現(xiàn)自增自減符號(hào)。
sort時(shí)有cmp不要忘記,有多個(gè)cmp不要混淆,重載了<更要小心。 (感謝 字幕君)- 注意考試/某些神仙OJ要求文件輸入輸出。
- 多測(cè)的時(shí)候,讀入一半就直接完成特判 return,忘記讀入該測(cè)試數(shù)據(jù)全部?jī)?nèi)容,導(dǎo)致輸入錯(cuò)位。 (感謝 ducati)
- 有多個(gè)名字相近的函數(shù)的時(shí)候不要調(diào)用錯(cuò)誤,如
dfs1(), dfs2()。 (感謝 maruize) - splay(LCT) 上二分要記得 pushdown。
- 刪調(diào)試語句的時(shí)候把輸出答案也刪掉了。 (感謝 ducati)
- 輸出
unsigned long long的方法是%llu而不是%ull。 - 注意二分答案的時(shí)候,
check函數(shù)的返回值到底是bool還是double/int。 - 注意位運(yùn)算優(yōu)先級(jí)!!!(
&>^>|) - 關(guān)閉流同步流混用 C 風(fēng)格和 C++ 風(fēng)格輸入輸出函數(shù)。
- ……
CE
- 我建議你先找臺(tái)機(jī)子編譯一下代碼。(感謝 happydef)
- 鍋都是 OJ 的:
- 某些神仙 OJ 不允許使用
bits/stdc++.h。 - 某些神仙 OJ 不能使用
c++11。 - 某些神仙 OJ 不允許你的函數(shù)與庫函數(shù)重名(指 Atcoder)。
- 某些神仙 OJ 的神仙題卡語言,請(qǐng)確保您會(huì)這些語言再去做。
- 某些神仙 OJ 編譯開了 -Werror,你的代碼必須沒有 Warning 才能過編譯。(感謝 WYXkk)
- 某些神仙 OJ 不允許使用
- 你的數(shù)組是不是開得太大了?
- 定義了一些形如
time,y1直接的變量,與庫函數(shù)重名。 - 庫函數(shù)自帶的
max,min要求兩個(gè)參數(shù)變量類型相同。 using namespace std和std::二選一。- 重載了
<用來priority_queue的話,要記得加const。 const對(duì)象或者函數(shù)調(diào)用的函數(shù)也要是const的。- 數(shù)組下標(biāo)不能是浮點(diǎn)數(shù)。
- ……
RE
- 操作空指針 (nullptr)。
- 下標(biāo)越界,數(shù)組開小。
- 注意有些維度可能是在值域上,而不是數(shù)組長(zhǎng)度上。
- 除以 \(0\),模 \(0\)。
- 線段樹記得建樹。
- 強(qiáng)制在線詢問結(jié)果錯(cuò)誤,導(dǎo)致解碼后的數(shù)據(jù)超出下標(biāo)。(實(shí)際上是 WA)
scanf("%d",n);(感謝 qidirj)printf("%d",&n);- 注意宏定義中,運(yùn)算優(yōu)先級(jí)的問題。
#define MX 100000 + 7
struct node{
int w ,lc ,rc;
}pool[MX * 40];
- 注意 sort 定義的
cmp必須能嚴(yán)格區(qū)分兩個(gè)元素的大小或相等關(guān)系,如果出環(huán),將可能會(huì) RE。(感謝 xiaolilsq) - ……
MLE
- 少用
stack,deque,queue,很占用內(nèi)存,vector占用空間比前面幾個(gè)小。 - 少用指針多用數(shù)組。
- 注意宏定義中,運(yùn)算優(yōu)先級(jí)的問題。
- 減少不必要的
long long使用。 - 函數(shù)記得寫返回值,即便你可能根本沒有用到。(UB 可能導(dǎo)致 MLE)

浙公網(wǎng)安備 33010602011771號(hào)