学了两年OI,记一下容易犯错和忘记的地方:
1.数据特别大或者特别小都可以考虑预处理。(特别是多组数据,数据很多的情况)
2.注意不要把两个循环变量套一块(很容易忘记)
3.注意不要开错变量的类型
4.局部变量和全局变量不要一起开,同时出现并同时使用肯定会错
5.函数有返回1,但是不要忘记其他情况返回0
6.有些问题要转换成判定性问题,经常用二分
7.if之后的其他情况不要想当然就else不加if,有可能有漏掉的情况
8.局部变量必须设置初始值,尤其是Longlong类型
9.十万以上数字相乘要记得开longlong类型
10.long long类型绝对值要加std::abs()
11.如果写了邻接表,要检查邻接表是否出错,不要自以为是正确的就忽略了。
12.tarjan要注意在low[x]==dfn[x]之后出栈的时候要把instack[x]重新赋值为0回去。
13.写拓扑排序的时候,要注意用的是栈而不是队列。
14.graham凸包算法用的也是栈
15.注意线段树的区间翻转或者交换标记应该用异或
16.类似循环要注意例如(int j=1;j<=n;i++)不能用错变量
17.函数返回值类型必须注意,不论是开头定义的还是里面返回的。
18.如果有浮点数除以浮点数,其中的浮点数是由一个整数转换过来,注意这个整数之前除以某个数,这某个数一定得是个浮点数,否则会出现例如ans/=2,tmp=(double)(ans/dui),导致ans是奇数产生的精度误差。
19.手写max和手写min的话,不要想当然没写错,函数的类型有没有开错也很重要
20.如果可以特判掉,也要先读入完,避免多组数据的时候下面会读到上一组数据
21.半平面交弹出队尾和队头的时候一定要先弹右边的,这是半平面交坑点,不然会WA
22.要注意乘法的时候有无类型溢出,如果有溢出,一定要记得前面先打“1ll*”转换成long long
23.由于rand()是伪随机数,所以如果程序中有调用rand(),应该在主程序加入srand((unsigned) (time(NULL)))
24.rand()的随机范围是32767,如果要生成更大的数据,应该要记得做其他处理
25.位运算的时候一定要加括号,因为它们的优先级十分的烂
26.Linux下不要开到关键字的变量,windows下编译会过,但是Linux下不会
27.C++连等有坑点,比如x=fa[x]=0;里面,如果写成fa[x]=x=0,那么X会先赋值为0,然后fa[0]会变成0,所以要注意连等的先后顺序
28.如果发现打表的数据是递增的,那么可以运用差分打表(b[i]=a[i]-a[i-1]),如果是非递增的,差分打表可能会另文件大小更大。
29.注意inf的设置,要经过精确计算再设置。