常见错误整理

常见错误整理

  以前一直不想整理常见错误,总是觉得到正式考试自然就改过来了,但是事实好像并不是这样的,所以就整理一下吧。我初中的生物老师说过:大家总是觉得犯过的错不会再犯,事实上却总是在一个地方反复的犯错。这是因为你之所以犯错,很可能说明这里对你来说就是比较困难,就是容易想不清楚。我觉得还是很有道理的。 


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的位置!

posted @ 2019-03-18 18:58  shzr  阅读(203)  评论(2编辑  收藏  举报