代码低级错误总结

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);}
}
View Code
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);}
}
View Code

2、线段树忘记下传懒标记

3、三目运算符优先级很低,?,:左右要加括号。下面代码中不加括号的话0和ask会连起来,作为上一个“:”后面的语句。

(l<=z?ask(x<<1,l,r):0)+(r>z?ask(x<<1|1,l,r):0);
View Code

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;
    }
View Code

现:

    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;
    }
View Code

数组名打错了。改了6个字多了80分。考试三小时改题5分钟。我真是改题大神。

10、ans没有清空为0。相当于多测了。

while(m--){
        int lmt=read();ans=0;
        dfs(1,0,lmt);printf("%d\n",ans);
    }
View Code

 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);
                }
            }
View Code
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);
                }
            }
View Code

 有一个很大的问题是写的时候不想变量含义,凭感觉写。

这是非常不好的习惯。要去想含义。

12、离散化以后树状数组的下标传入离散化前的值。

因为记住贡献要加离散前的,然后顺手给下标也变成离散前的了,

TLE60变成RE10。算是变量含义没想清楚。

13、区间DP没有DP起点>n的部分。

>n的部分会被前面<=n的部分利用,也要DP。

背景:简单模板题
原因:1、细节打错
     2、无法对拍
方法:
1、输出过程量,替代对拍。
2、打时、检查时,想运行方式。

14、支持回溯并查集不能路径压缩。

 15、变量名uvxy用混。(树上暴力。)

posted @ 2019-09-25 19:30  seamtn  阅读(285)  评论(1编辑  收藏  举报