代码低级错误总结
1、lca预处理dfs中,1~20顺序枚举,而非倒序。
void dfs(int x,int fa){/** f,dep */ f[0][x]=fa;d[x]=d[fa]+1; for(int i=18;i>=0;--i)f[i][x]=f[i-1][f[i-1][x]]; qxs(){dfs(v,x);} }
void dfs(int x,int fa){/** f,dep */ f[0][x]=fa;d[x]=d[fa]+1; F(i,1,18)f[i][x]=f[i-1][f[i-1][x]]; qxs(){dfs(v,x);} }
2、线段树忘记下传懒标记
3、三目运算符优先级很低,?,:左右要加括号。下面代码中不加括号的话0和ask会连起来,作为上一个“:”后面的语句。
(l<=z?ask(x<<1,l,r):0)+(r>z?ask(x<<1|1,l,r):0);
4、判断了节点在子树内部,在字数外面,还要判断是他自己。
5、取模优化错了。有一个地方有减法,忘了+mod,出负数了。有减法的地方一定要+mod
5、主席树ask:if(l==r)return 1
正确:return sz[]
6、数组开小。枚举全部区间是n^2的,开了n的。
7、memset 、memcpy :不写sizeof,直接写长度,要注意字节长度。
一是bool,char是一个字节,二是define int LL 后,注意4字节变8字节。
没有必要,尽量不要用。
8、1e6个1e15相加,爆LL
9、原:
for(int i=1,j=1;i<=top&&a[i]<=n;++i){ if(a[i]!=a[i+1]){ ++ans[j];--ans[0]; j=1; } else ++j; }
现:
for(int i=1,j=1;i<=top&&sta[i]<=n;++i){ if(sta[i]!=sta[i+1]){ ++ans[j];--ans[0]; j=1; } else ++j; }
数组名打错了。改了6个字多了80分。考试三小时改题5分钟。我真是改题大神。
10、ans没有清空为0。相当于多测了。
while(m--){ int lmt=read();ans=0; dfs(1,0,lmt);printf("%d\n",ans); }
11、变量名写错,意义搞混。
所以改题的时候要仔细想想,打完查一遍。
之前一个变量写错了,改完一个地方忘了改另一个地方。
i->w
if(w%j==0){ U[j].push_back(u);V[j].push_back(v); if(j*j!=i){ U[w/j].push_back(u);V[w/j].push_back(v); } }
if(w%j==0){ U[j].push_back(u);V[j].push_back(v); if(j*j!=w){ U[w/j].push_back(u);V[w/j].push_back(v); } }
有一个很大的问题是写的时候不想变量含义,凭感觉写。
这是非常不好的习惯。要去想含义。
12、离散化以后树状数组的下标传入离散化前的值。
因为记住贡献要加离散前的,然后顺手给下标也变成离散前的了,
TLE60变成RE10。算是变量含义没想清楚。
13、区间DP没有DP起点>n的部分。
>n的部分会被前面<=n的部分利用,也要DP。
背景:简单模板题
原因:1、细节打错
2、无法对拍
方法:
1、输出过程量,替代对拍。
2、打时、检查时,想运行方式。
14、支持回溯并查集不能路径压缩。
15、变量名uvxy用混。(树上暴力。)
Informatik verbindet dich und mich.
信息将你我连结。