常见问题表

版权声明:本博客為本人嘔心瀝血之作,未經允許禁止轉載! https://blog.csdn.net/qq_39529862/article/details/81708708

关于tarjan

1.tarjan双连通分量在有重边的时候,dfs存的是父边不是父亲

2.tarjan更新全写成low都可以

关于高斯消元

1.找关于现在消元这行元素最大的一列可以减少精度问题

關於語句執行問題

1.在一個語句中同時執行2個相同的函數,最好將其分為2個語句

关于常数优化问题

1.将要取模的数写成a=(a+b)%mo比写成(a+=b)%=mo更快(即使后者代码量更小)

2.在数组中多次取的元素赋值成一个变量存取比直接存取更快

3.写常变量取模比写宏取模更慢

扫描二维码关注公众号,回复: 4310122 查看本文章

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.當要算出”符合某一個要求”的所有數,並且如果直接算毫無頭緒,但是算出”不符合這個要求”的數比算出”符合某一個要求”的所有數更加簡單(有公式,或時間複雜度更低)時可以使用容斥原理

猜你喜欢

转载自blog.csdn.net/qq_39529862/article/details/81708708