基础算法方面:
-
充分认识到了二分、贪心、双指针等基础算法的重要性,在CF、ATC等中的题和ACM中的题(听说)大多都仅考次类基础算法但是需要运用熟练,在此前我一直忽视了此类算法的重要性并且也忽视了思维的提升,导致比赛有时甚至会在此类基础算法题中卡住
-
以往也忽视了对于思考程序时间复杂度优化这一方面的内容,以往学算法都只是学到皮毛很少领悟到真正起到优化作用并且是否能够推广到普遍此类题目的精髓
-
对于时间复杂度优化方面,通常是由从单独的点来考虑,变成从整体来考虑。
例如给定n个数求任两个数异或和,如果从每个数单个考虑,那就只能在\(O(n^{2})\)复杂度内完成,但是如果从整体方面考虑,对于所有的数我们一起看,由于给的数在long long范围内,我们可以在二进制中从高到低位统计每一位当中,这n个数有多少个0多少个1,因为只有0^1才会产生1对答案产生贡献,这样复杂度就优化到\(O(nlogn)\)。或者也可以从空间换时间的角度考虑,例如求有多少区间的和是某一个数值,可以用桶来优化时间复杂度。
做题总结方面:
-
对于题目中数据很大10^18级别概率(期望DP)通常记忆化搜索,因为题目中通常有除法的操作,而倒着推的话由于一个数的因数不会太多,所以复杂度是可以接受的。
-
对于复杂度优化方面通常由从单独一个一个数考虑变为从整体考虑,或者空间换时间。如考虑n个数异或操作时,若从每个数单独考虑与其他n-1个数分别异或求和复杂度是O(n^2 ),但是利用异或的性质从高到低位统计每一位这n个数中0,1分别出现的情况来求和就是O(nlogn)。再如统计满足一定性质的一段数区间和有几个,可能可以用桶来优化时间复杂度。
-
对于博弈论DP和期望DP通常采取刷表法,倒推的方式,原因是通常它们的结果是一定的但是起点是不同的。
-
关于单调栈使用变熟练,发现单调栈貌似一些场景可以被笛卡尔树代替
-
对于并查集的操作和维护更熟练
-
对于贪心又练了一些但是感觉上认识依旧不足
-
DP方面,复习了各种背包问题。并着重看了概率期望DP但是依旧不能完全掌握此类问题
-
DAG上概率DP通过拓扑排序保证每个点概率被充分计算再去更新其他点(其实就是拓扑排序的排序方式决定的
-
复习了数位DP,但是依旧不算熟练
-
关于倍增思想,最初接触到是求Lca,而后是区间DP小部分题用倍增优化,再后图上倍增,当我们发现要求在一个图中走的步数达到10^18级别得考虑倍增
-
关于随机化哈希,维护两个序列(都是1-N的数)多个区间中数的个数和出现次数是否都相等,可以用随机化哈希实现
-
设计DP转移方程可以先不考虑复杂度,不怕多个维数来设计,而后再优化(不然不敢加维数只能对着题目干瞪着