关于tarjan
1.tarjan双连通分量在有重边的时候,dfs存的是父边不是父亲
2.tarjan更新全写成low都可以
关于高斯消元
1.找关于现在消元这行元素最大的一列可以减少精度问题
關於語句執行問題
1.在一個語句中同時執行2個相同的函數,最好將其分為2個語句
关于常数优化问题
1.将要取模的数写成a=(a+b)%mo比写成(a+=b)%=mo更快(即使后者代码量更小)
2.在数组中多次取的元素赋值成一个变量存取比直接存取更快
3.写常变量取模比写宏取模更慢
4.位运算比直接运算省时间
5.i++比++i慢
6.判断数是否等于-1使用~a比a==-1省代码又快
7.读入优化要写负数判断
8.如果要計算2的冪次,那麼最好遞推two數組,比二進制位移快多了
关于网络流问题
1.要加反向边
2.dinic在不能增广时退出更加省时
关于链式前向星问题
1.当这个图为无向图时,数组必须开2倍以上
關於遞歸的問題
1.當你要臨時修改一個或一些值讓下次遞歸使用,且要用變量或數組(較小)tmp來存這一次遞歸的結果時,最好在這層遞歸中設置tmp,且將tmp初始化
關於dp的問題
1.在賦初值時要將所有不合法的值都賦成inf
2.在作treedp時,如果結果和選子樹的順序沒有任何關係,那麼就要考慮以前選擇的方式對現在的影響
3.在dp時,要考慮有什麼狀態可以到達現在的狀態再進行dp
4.在進行數位dp時,如果使用刷表法,而且要設和數位長度有關的狀態維len的話,一般使用len+1,將初始狀態f[1,s]
(s為其它狀態)設成初值
5.數位dp在求次小滿足要求的解時,不應該存g2次小值數組,而應該在數位dp時控制當前枚舉的數位,當當前枚舉到len-1時,應該將限制值變為a[len]+1
6.在斜率優化dp時,longlong轉為double應該乘以一個1.0,或者進行強制類型轉換,否則會wa
7.斜率優化不存在>=
8.dp之中,如果不能通過正常方法優化時間複雜度,那麼可以通過調小參數值來優化時間複雜度
9.博弈dp時,要將現在的貢獻-以前的F值得到現在的F值
關於搜索的問題
1.雙向寬搜時,應當將所有的狀態都放進一個隊列里,並且在這些狀態中記錄它們是屬於第一個bfs還是第二個bfs的
2.開放尋址法哈希在通常情況下耗得內存比拉鏈法哈希和字典樹少,並且速度在一般來說會更快
关于矩阵乘法的问题
1.矩阵乘法需要分乘a矩阵和乘b矩阵的2个函数
其他问题
1.在开数组时,要留出至少为5的空余
2.讀入時要加取地址符
3.在做期望dp時,不存在的那一項以及與其在同一個括號內的項的值都要算作0
4.數組開大點是個好事,因為當你在變量沒有初始化時,大數組可以提前將其初始化為0
5.c[m][n]=c[m-1][n-1]+c[m][n-1]
6.逆元數組要從1開始計算
7.在做全排列问题时,若预处理以后的代价的数组标号是固定的,但是要算代价时的标号会变化,那么得在全排列中枚举标号
8.一般來說,如果效率要求不高,所有普通搜索問題都建議轉換為無腦搜索或者無腦最短路來計算
9.spfa大考(noip以上)不要使用,應該使用堆優化的dijkstra,有條件的加一下線段樹優化
10.如果要寫spfa,要加上vis數組優化
11.隊列,棧,二叉堆這些數據結構最好手寫
12.找环不可以使用bfs版toposort
13.2個棧在多數時候可以代替鏈錶
14.組合數要判m是否>n
15.sigma(d|n)f(n)==n f是phi函數
16.當要對一個輸入進行特判return 0時,最好先讀入完輸入再特判(數據太大除外)
17.啟發式合併要小的並到大的裡面去,線段樹除外
18.cdq分治要寫l>=r
19.bits在x==0時會re,要特判
什麼時候可以使用容斥原理
1.容斥原理的使用對象的數據範圍不大,最大為25
2.計數問題可以使用
3.當要算出”符合某一個要求”的所有數,並且如果直接算毫無頭緒,但是算出”不符合這個要求”的數比算出”符合某一個要求”的所有數更加簡單(有公式,或時間複雜度更低)時可以使用容斥原理