关于奇奇怪怪的bug

· · 个人记录

前言

这里记录了一些做题时匪夷所思的BUG

2020-3-28

为什么洛谷会卡return 0 ? P3919可持久化数组

这道题本身完成用了30min,结果疯狂RE 代码

没错,我最终调了60min后加了三个return 0 代码

就这样,加了3个return 0,过了......

2020-4-18

又一次见证了一个return 0惨案

今天做扫描线,好不容易挑出来一个过样例的,交上去->RE

打上几个return 0,交上去改改空间->RE+TLE

一看还有一个线段树 update 没写这个,打上return 0->

本来做好了WA的准备,结果突然跳出来一个绿块、越来越多......

10AC,过了......我还能说什么。

2022/6/25

今天写了这样一行代码:
if(gtz(s[++r]==0)
很不幸,执行过这个语句后,不仅**gtz**的值不对,**r**还被+=2了
一脸懵逼的查错,最终发现问题出在
#define gtz(fi) (hl[fi]!=ti?0:zl[fi])//这样清零就只需要ti++ 
这个宏定义上
一展开就是
if((hl[++r]!=ti?0:zl[++r])==0)

2022/6/27

P4381 Island 这题前后做了9个月.......令人难以想到的是,问题出在找树的直径的两次dfs上

void dfs(int w,long long l,int fa){//更新答案 
    for( w可所到的节点v){
        if(v是父亲或在环上)continue;dfs(v,c[p][i]+l,p);}}

可一开始找不到,利用生成器(这题数据出人意料的很好生成)才拍出了

“v是父亲或在环上”这一句,在第二次dfs时,会导致树根不会被扩展......

应为“v是父亲或(v和u都在环上)”

2022/7/20

莫队题(十四分块)
bool cmp(ask a,ask b){
    return ku[a.l]==ku[b.l]?(ku[a.l]&1)^(a.r<b.r):a.l<b.l;
}
......
for(int i=1;i<=m;i++){t[i].l=read();t[i].r=read();t[i].h=i;}
sort(t+1,t+1+m,cmp);
for(int i=0;i<=n;i++)ku[i]=i/NB+1;mb=ku[n];
怪不得n,m=500000却动了5e10次

2022/7/22

P5383 普通多项式转下降幂多项式

我的多项式板子清空做的并不好,因此对于 
cpy(f[w*2+1],f[w],r-l+1);
分配了4(r-l+1)空间,然后WA了后几个点的后面部分
果然,int t2[10000000];不够用......2e7就够了
事后发现,这样多的空间确实必要,3倍就WA掉了......

2022/8/22

void print(int a[],int n){
  for(int i=0;i<n;i++)cout<<i<<" ";cout<<endl;
}
int main(){
  int n=read(),m=read();n++;m++;
  for(int i=0;i<n;i++)a[i]=read();
  for(int i=0;i<m;i++)b[i]=read();
  times(a,b,n,m);print(a,n+m-1);
  return 0;
}
多项式板子温习,竟然出了这种神奇事故......更没想到接下来有这种事故
for(int i=1,i2=2;     i>ln    ;i*=2,i2*=2){
    int u=kpow(op?G:iG,(mu-1)/i2);
    for(int j=0;j<ln;j+=i2){
      ll d=1;
      for(int l=j;l<j+i;l++){
          int tt=s[l+i]*d%mu;s[i+l]=s[l];
          add1(s[l],tt);add2(s[l+i],tt);d=d*u%mu;
      }
    }  
  }

2022/8/29

P5355 [Ynoi2017] 由乃的玉米田,询问要分类讨论,结果把讨论出去的询问也顺手加入了莫队......

if(a1==4&&a4<=K)o[a4].push_back(ask{0,a2,a3,0,i});
【else】 t[++la]=ask{a1,a2,a3,a4,i};

2022/9/22

P5064 [Ynoi2014] 等这场战争结束之后

按秩合并片段
if(he[x[w]]>he[y[w]])swap(x[w],y[w]);
x[w]=find(x[w]);y[w]=find(y[w]);    

44->100

2022/10/8

高精度+1<<b,压位1<<60
big operator +(big a,int b){int k=b/B+1;
    if(a.o<k)a.o=k;a.s[k]+=1LL<<(b%B);
    for(int i=k;i<=a.o;i++){
        if(a.s[i]>=E){
            a.s[i]-=E;a.s[i+1]++; 
        }else return a; 
    }
    if(a.s[a.o+1]){a.o++;}return a;
}

2022/10/8

警钟敲烂
int l[N],w,h;
void clear(){w=1;h=0;}