学习笔记
2019.1.25:
1.慎用getchar和scanf("%c"),这两个都会读回车和空格,用cin或者scanf("%s")会更好
2.处理环形问题,将数组开大一倍,令a[i+n]=a[i],就能实现循环的问题。
3.计算只包含加法,减法和乘法的整数表达式除以正整数n的余数,可以在每步计算后对n取余,结果不变。[由该结论可得出已知n%mx,可得(n*10+k)%m(x*10+k)%m]
2019.1.28
2.多组数据的情况下强烈建议用vector存图
2019.2.4
1.当一道题顺着题意不好做时,我们可以考虑正难则反的思路。
2.枚举题往往需要通过分析问题来简化问题,从而缩小枚举的范围,优化枚举的时间复杂度。
3.二分的标志通常是最大值最小获最小值最大,但判断是否真的要用二分应判断题目时是否满足某个单调的性质。在较高难度的题目中有时需要二分结合其他算法来解题。
2019.2.7
1.求树的直径的方法:
(1)Bfs(以任意一个点为起点找一条最长路,再以最长路的终点为起点再找一条最长路,该路径即为树的直径) 【只适用于无负权的图】
(2)树形DP。【适用于带负权的图】
2019.2.8
1.Dijkstra时间复杂度O(n^2)/O(mlogn)
2019.2.15
- 在没有用到递归的函数中,我们当然可以在函数内创建队列或栈,但在tarjan缩点的算法中,栈必须开在外面,容易出错(P3627 [APIO2009]抢掠计划)
2019.2.17
- 不仔细读题你会死的很惨的
2019.2.21
- 最好不要在aray数组里再开数组,可能会Re
2019.3.10
- 注意去掉输出的中间结果
- 做题时最好手动模拟过一遍样例,防止误解题意,排除掉错误的算法
- 01背包中防止重复更新的两种方法,一种是倒序枚举,另一种是开一个辅助数组缓存更新后的值
2019.4.27
- 二项式定理:(a+b)n=an+[C(n,1)]a(n-1)*b+C(n,2)a(n-2)b2+……+C(n-1,n)ab(n-1)+b^n
- 通项T(k+1)=C(n,k)a(n-k)*bk
- 式中,C(n,i)表示从n个元素中任取i个的组合数=n!/(n-i)!i!
- 系数也可表示为杨辉三角
2019.7.11
01黑白染色中,所有的棋盘一定属于以下两种类型:
- 黑格的行和列奇偶性相同,白格不同
- 白格的行和列奇偶性相同,黑格不同
高阶数学笔记
- c++浮点数靠近0取整,如-1.5取整得-1
- 当1<=d<=n时,n/d不同的取值不超过2*sqrt(n)
- 当1<=d<=n时,n/d的和为严格nlogn,常数极小,可以跑过5e6的数据
- 不超过n的质数个数约等于n/ln(n)
推论:
- n附近的质数密度约为1/ln(n)
- 第n个质数约为n*ln(n)
- 若一个数有奇数个约数,则他是完全平方数
2019.7.16
-
线段树的懒标记,你当然是知道的,若只需维护区间和,常规操作就可以了,如果还要求最值的话,就要另行考虑了
若懒标记是加减法,只需加减max/min标记
若是取反,则max=-min,min=-max
总之在维护懒标记的同时也要正确的维护其他所有标
记,一个都不能漏,而且要具体情况具体考虑
2019.9.17
- static变量不能以type x=……的方式赋初值
2019.11.14
1.vector resize不能用来多次赋值!!切记!!!正确的写法是先clear再resize