常见错误整理
常见错误整理
以前一直不想整理常见错误,总是觉得到正式考试自然就改过来了,但是事实好像并不是这样的,所以就整理一下吧。我初中的生物老师说过:大家总是觉得犯过的错不会再犯,事实上却总是在一个地方反复的犯错。这是因为你之所以犯错,很可能说明这里对你来说就是比较困难,就是容易想不清楚。我觉得还是很有道理的。
1. 没有spj,而且还要输出实数时,不要忘了判 $-0.0000001$ 这种东西,改成正的 $0$
2. 点分治时,更新最大子树大小是
而不是
如果写成这样,那复杂度就看运气了。
3. 线性基插入时,位数一定一定要包括0,因为是 $(1<<i)$ ,如果不循环 $0$ 的话就会少了 $2^0=1$ 这个数字了。写线性基时可以试试这组数据:$1$ $2$ 如果写挂了就会只插入 $2$.
4. 如果是对于线段进行离散化,最差情况下可能任意两端点不重合,所以数组就要开到线段数的二倍。如果是线段树的话就要开八倍。
5. 不要写错文件名!包括输入输出的文件名和提交文件的文件名 !!!!!!!!!!!
6.Dinic合集:
bfs时,不要忘了vis[s]=true;小数据有时候还看不出来,但是数据大起来后就会TLE.
如果bfs里面已经写了cur优化,不要...忘了用...还有就是要加取地址符。
7.二分图判定:要么就黑白染色,要么就判奇环,不要自己YY一些似对非对的算法来用!这一条适用于所有算法。
8.做题顺序:先看一遍题 $\rightarrow$ 可以秒掉的部分分 $\rightarrow$ 对拍(最暴力的对拍!) $\rightarrow$ 想一想各个题的做法 $\rightarrow$ 看起来好做一点的题 $\rightarrow$ ...
这个顺序正在试用中...这段时间的考试都会采用这样的方法。因为肝高分题目肝到最后时刻才发现有暴力分没写/有简单题没开/简单题写挂是一件很郁闷的事情,而且大多数情况下...这个高分题目也是很难调出来的。
9.最近真是奇怪错误频出啊...快读,不要忘了处理负数!初始化时,$x=0$,$f=1$ !
10.如果是稍微复杂一点的推式子题目,先在纸上写好,不要再动这一部分,等程序写完的时候再对一对看看有没有抄错;
11.只要涉及乘法取模,就需要注意两个乘数乘起来还没有取模的时候会不会爆掉,如果不能保证就快速乘。特别是注意会不会爆longlong。
12.一个比较少见的错误,估计以后不会遇到了,但还是记下来:数位dp有时有多个状态:方案数,所有方案的和等等。这时,常用的“方案数为0就跳出循环”就不能用了,因为方案数看起来是0,但可能只是恰好为模数的倍数,这时的方案值的和不一定是0。这个错误说出来显得很简单,但是挺难发现。
13.对于一些虚树的题目:原树没有边权,或都为一,所以暴力做的时候可以不考虑;但建成虚树后,因为有的边被压缩了,所以可能会出现边权,不要忘掉了。
14.论如何枚举每个数的约数:
虽然 $1-n$ 所有数的约数总个数是 $NlogN$ 级别的,但是如果枚举得不好,就退化成 $N\sqrt{N}$ 了。
错误示范:复杂度 $O(N\sqrt{N})$
正确做法:复杂度 $O(NlogN)$
15.多组数据的时候,尽量不要用类似于“dep[j]==0”表示 $j$ 这个点没有访问过,如果确实要用,一定要清空所有这类的数组!!这种题如果要对拍,不要怕麻烦只拍单组数据...
16.LCT中,如果要修改一整棵Splay的信息,不要随便找到一个点就改,要先 $findroot$ 一下;
17.做图论题的时候,看清楚是有向图还是无向图!
18.dij的vis数组表示有没有作为过堆顶,而spfa的vis数组表示的是现在是否在队列里;
19.ST表的小优化:把 $st[100000][20]$ 换成 $st[20][100000]$ 可以有效提高速度;
20.打板子ing,结果打一个错一个是什么鬼?线性基里有这么一个判断(x的第i位是否为1),不要忘了给 1 开longlong!好像说的不大清楚?像这样:
21.写完程序好好读一读,看看是不是自己想写的那个样子;manacher中注意两点:
将原字符串分散时,要倒着循环,否则就覆盖了:
还有这句话,似乎每一处都有可能出错,一定要认真检查或者对拍(反正找回文串的暴力很好写),尤其要注意取min的第一项到底是 $j$ 减去谁:
22.又是多组数据,好像也没法概括了,仔细描述一下吧 QwQ:清空数组时,仅清空了[1][1]到[n][m],但是,这道题的不合法状态是用m+1来表示的!这样对于单组数据并没有问题,但是多组数据时就会错了。因为在上一组数据里[n][m+1]可能是合法的,这次就会访问到一些本不该访问到的量了。
23.不要访问非法的区域!即使那个区域看起来好像访问了也是空的,但是很可能之前的某次是在里面填过数据的。访问前判断一下是否可以访问,不行就退出;
比如说:单调队列的队首,在队列为空的时候不能访问;查询最小/最大值时,空的地方不能访问。
24.Tarjan:
缩点:弹栈时不要忘了清空vis数组;
割点:
这句话只有在“id[j]==0”的情况下才能用,毕竟你不能用子树外的点来判断自己是不是割点qwq
25.zz错误:写了快读忘了用...
26.线段树合并只有将询问离线后才可以直接用“覆盖式合并”,否则,合并时必须新开节点;
27.SAM数组开两倍...
28.CDQ中排序比较多,注意是给谁排序,是按照什么排序。另外要注意的就是如果有重复元素,必须压到一起做才行,去重时也要注意:是对读入的数排序而不是对新数组排序;
29.最近犯的错误真的是越来越傻了;要取模的题目,别忘了取模...update的时候,不要忘了取模...
30.fft做快速幂时,每次要将虚部清零,否则精度会炸;
31.没事不要压行,没有任何意义。压行之后看起来也比较费劲,而且...即使再不压行,也不可能超过100kb对吧...
32.注意:不要让数组越界,尤其是越到小于0的位置!