易錯總結
易錯總結
(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
並查集:
注意先給 fa 賦初值
注意資訊能不能路徑壓縮,不能的話選擇按秩合併
!!!網路流
tot=1;
初始化for(int i=1;i<=N;i++)
注意是 NNNN
技巧:
對於某些中間結果非常大但不會在答案中出現的題,可以用long double計算中間答案最後用long long輸出