这个随笔主要是记录一下做题过程中的易错点。
1.memset只能初始化0或者-1.
2.数组大小还是得准确计算,不要为了大小为1的差距而爆0了。
3.lowbit(0)=0.
4.gcd(F[n],F[m])=F[gcd(n,m)],不等价于gcd(F[n]%mod,F[M]%mod)。
5.关于tarjan:
邻接链表:
for(int i=head[u];i;i=edge[i].next){ int v=edge[i].to; if(!dfn[v]){ ......... } else if(vis[v]){ ........ } }
可以看出,这里是在先判断有连边再判断dfn的。
邻接矩阵:
for(register int v=1;v<=n;v++){ if(a[u][v]){ if(!dfn[v]){不能写成if(!dfn[v]&&a[u][v]) tarjan(v);因为它得先判断a[u][v]有路径再去判断vis[v] low[u]=min(low[u],low[v]); } else if(vis[v]) low[u]=min(low[u],dfn[v]); } }
这个错误,我找了好久,以后遇到类似的邻接链表转邻接矩阵不能再犯错了!
6.三目运算符:pre[i]==-1?0:1;不能写成pre[i]=-1?0:1;!!!一定不能写成等号,编译器不报错。
扫描二维码关注公众号,回复:
3414406 查看本文章
7.数组大小:如果const int N=???,int A[N],然后再for(i=1;i<=N;i++),这样数组就越界了!!因为A[N]这个空间是没有开辟的。
8.一道题目如果想不出方法,可以选择(分类)或者(先思考出简化版的算法),如果选择了分类的话,最后一定要思考一下分的类能不能合并!
这样可以简化代码,避免找错时间过长。
9.在一些有关图的题目中,如果题目没有明确,这个图是个树,遍历的时候一定不能只从一个点开始遍历!!因为它们有可能不连通!!