1.多组数据
(1)没有清空,或把实际需要清空的当成不需要清空
①图论f1数组
②线段树的标记
③各种数据结构要消去内存占用
④各种单组数据的时候,因为默认是空的,所以没有初始化的东西
一定要极其仔细!错了不知道多少次了!!!
(2)某组数据中少读入了一些数据
①判-1之类的东西时,直接跳出循环,没有把剩下数据读完
2.读入
(1)读入数据范围接近上限,于是运算过程中超限
(2)scanf时,double用%lf,float用%f
printf时,double和float都用%f
long double不管scanf还是printf都是%Lf,但是实际输入输出中有某种问题,尽量少用
(3)ios::sync_with_stdio(0)尽量不要用,好像会有概率(玄学?)出问题
3.排序
(1)排序某一组数据后,忽略了这组数据的编号已经失去意义,与其他没有排序的数据结合使用
①(kdtree) 用了nth_element/sort等,又要求输出编号时,要注意
4.STL
(1)设it是一个p类型对象的迭代器,并不能用it==(任意一个p类型对象).end()来判断迭代器是否失效
5.取模
(1)快速幂的时候,显然指数不能直接对模数取模
6.数据范围
(1)(看错数据范围等原因导致)没有开longlong
(2)inf不够大或者-inf不够小
①在将int改为longlong后没有对应将inf从0x3f3f3f3f改为0x3f3f3f3f3f3f3f3f
7.对拍
(1)python高维数组不能用a=[[]]*10000,要用a=[[] for i in range(10000)](不然在a[0]里面append元素,a[1],a[2],a[3],..里面都会有)
8.c++
(1)貌似有些编译器上使用某些未初始化变量也不会有提示,还是要自己仔细查一下
(2)不能为了省事而不同作用变量用同一个变量名,容易出事
9.强制在线
(1)忘了做那些异或之类的操作(然而却很容易过样例,对拍时候也容易忘,要小心)
(2)忘了给lastans赋值(注意因为在做某些特判而有多个可能输出的位置的时候)
1.图
(1)有向图判环,自环一定要特判!(不能直接用强连通)
2.线段树
(1)数组模拟指针时,节点编号(num)与区间端点(l)搞混
3.并查集
(1)带撤销并查集,少备份/还原了东西
4.细节
(1)内外层循环误用相同循环变量
(2)对于一类依赖某种分类方式来达到根号复杂度的方法(比如多字符串,暴力求某些东西,复杂度带的根号),很可能需要去重(不然被卡到$n^2$)
(3)交程序前一定要记得看一下是否有可能要求手动加上头文件的函数(比如abs,sqrt,没有cmath的话有时候本机AC提交CE),还有C++11记得去掉
(4)逆元的坑:模数不是质数,一般肯定不会用...
即使模数已经是质数了,逆元也不是随便用的
如果涉及到的要求逆元的数大于等于模数,在某些情况下(忘了哪些情况了),要在求逆元前先取模;
如果涉及到的要求逆元的数大于等于模数,且是模数倍数,那么逆元就不能用了(想想看,如果c=a*(kp)%p,在已知(kp)和c的情况下,显然不能反推出a),尝试先模原模数的一个倍数使得模数达到足够大,输出的时候再对原模数取模(应该是不行的,因为这样的话模数不是质数);尝试用各种特殊方法化简吧(比如这个公式:a/b%c=a%(b*c)/b)。。。
(想一想可以知道,阶乘逆元/p^k倒是一般都不要紧。。因为要求的n!和p^k,一般n,p都分别小于模数,那么n!和p^k也不可能是模数的倍数(当然要求模数是质数);不过还是要注意)
(5)对于某些求最优化,有多个关键字的问题,最好不要用pair简化程序,应当手工定义结构体,手工定义比较函数,否则很容易由于pair默认的比较方式而出错
(6)n,m之类的搞混
(7)题面很绕,各种搞混
5.平衡树
(1)(主要是LCT)取左/右子节点时没有考虑节点上的reverse_tag
6.字符串
(1)不等长的串s1,s2满足(按字典序)s1<s2,在s1,s2后分别加入一个字符后不一定仍然满足
(于是后缀平衡树不能在尾部加入字符)
7.树上的数据结构
(1)树剖求重儿子不需要sz[0]=0x3f3f3f3f,点分求重心要
(2)树剖+线段树,线段树记得判当L>R时互换L,R
8.数学
(1)等比数列(n^1+n^2+n^3+...)一类的求和要特判n=1!
9,dp
(1)发现dp题数据范围小又搞不出来一定要特意想一想区间dp是否可做
做题
1.算错复杂度(因为根本没有仔细算),以为是正解,码很久结果既没有分又把时间用掉了