1. 程式人生 > 實用技巧 >易錯總結

易錯總結

易錯總結
(upd:排版/內容混亂,敬請諒解)

所有題至少想30分鐘再去下一題,想不出來就敲個暴力(別一直想正解)

每道題分配時間均勻——或者簡單題能保證穩拿分的多一點時間檢查對拍

最後時間

不要再輕易改程式碼(至少不要大改)查陣列大小開得對不對,會不會MLE或RE; 查樣例能不能過,會不會CE; 查相近變數是否寫錯(如l和L,i和j,ADD和Add); 簡單再次讀題,查是否有細節沒有注意; 查檔名 以及freopen

寫完程式碼自己先靜態看一下

讀題仔細,落實每一個變數的資料範圍 ,看清先後(毒瘤出題人邊權先讀入),程式碼不要打錯(比如n,m打反,抄錯)

重視細節和特殊值,比如臨界和一些不符合自己推出的普遍規律的,特判

多測不清空,爆零兩行淚

看清有向圖還是無向圖

陣列開大(tarjan一般開大5-10倍,線段樹開4倍,連邊的開2倍)

記得呼叫函式!!!(日常寫了樹剖不呼叫)

開 long long int和int乘起來如果爆long long 要強制轉換

\(long~long\)左移要用\(1ll\)

不要傻哈哈全\(memset\),用多少清空多少,可以用個棧啥的

標頭檔案要寫全(不寫vector本地過編譯)

注意 0 一直乘的情況——死迴圈

不要所有函式都加Inline ,會MLE

少寫while( n-- )....很大機率不過腦子就錯了——寫for準沒事

樹狀陣列那裡最好寫上\(i\)

搜尋注意邊界(例如矩形啥的別超過邊界)

組合數記住一定是 $ \frac{n!}{m!(n-m)!} $ 千萬別忘記 (n-m)!

凡是要取模的題,每步取模.每有一步減法,必須加上模數防止炸負數 \(a*b\%P\) 應該是\((a\%P*b\%P)\%P\)

先排序再去重!!!

\(i,j\)不要打反

\(dfs\) :樹的fa才有用 ; 連通塊的話 用\(vis\)判是否訪問過

結構體所有的變數就算不用也要賦初值為0,否則會隨機賦值

三種遍歷

前序遍歷/先序遍歷
void dfs(int x){
printf("%d\n",x);
if(ls[x]) dfs(ls[x]);
if(rs[x]) dfs(rs[x]);
}

中序遍歷
void dfs(int x){
if(ls[x]) dfs(ls[x]);
printf("%d\n",x);
if(rs[x]) dfs(rs[x]);
}

後序遍歷
void dfs(int x){
if(ls[x]) dfs(ls[x]);
if(rs[x]) dfs(rs[x]);
printf("%d\n",x);
}

子串要求連續,子序列不要求連續

(double)後面要先寫int型別的才能轉換!!!

預處理 \(lg\)陣列

lg[0]=-1;
for(int i=1;i<=n;i++) lg[i]=lg[i>>1]+1;
or
for(int i=2;i<=n;i++) lg[i]=lg[i>>1]+1;

樹上k級祖先

注意這裡必須用int ,不能是unsigned int,因為這裡 只有當i=-1才會跳出迴圈

for(int i=19;i>=0;i--)
	if((1<<i)<=d) {
		x=fa[x][i];
		d-=(1<<i);
	}
return x;

用堆和棧判是否為空

尤拉序求lca:

陣列開兩倍,迴圈用cnt而不是n

-1的二進位制是全是1

裡 有 tolower() 函式,將字元轉化成小寫

並查集:

注意先給 fa 賦初值

注意資訊能不能路徑壓縮,不能的話選擇按秩合併

!!!網路流

tot=1;

初始化for(int i=1;i<=N;i++)

注意是 NNNN

技巧

對於某些中間結果非常大但不會在答案中出現的題,可以用long double計算中間答案最後用long long輸出