警示后人

P3384 【模板】重链剖分/树链剖分

0xyz @ 2023-04-26 12:53:29

因为 pushdown 里的 mid-l+1 写成 l-mid+1 调了一上午(关键是过了样例,还过了 1、3、4 这 3 个点)。

总结一下常见错误:

MLE/RE:有可能你数组开小了。

WA:有可能在上跳时你把if(dep[top[x]]<dep[top[y]])swap(x,y);写成了if(dep[x]<dep[y])swap(x,y);(前面那个对,后面那个错)。

也有可能你取模不够勤奋。

也有可能你传进线段树里的目标区间,左端点大于了右端点。

或者 dfs2 里,没有先 dfs 重儿子。

如过还是错,也可以检查一下线段树。

建议如果肉眼检查几遍检查不出来,并且在一些小的数据点也是错误的,可以复制题解下来对拍。

我提供一个数据生成器,可以调参数,不喜勿喷。

#include<bits/stdc++.h>
using namespace std;
int main(){
    srand(time(0));
    freopen("qwq.in","w",stdout);
    int n,m,rt,mod;
    n=7;m=10;rt=rand()%10+1;mod=1e9+7;
    cout<<n<<' '<<m<<' '<<rt<<' '<<mod<<'\n';
    for(int i=1;i<=n;i++)cout<<rand()%20<<' ';
    for(int i=2;i<=n;i++){
        cout<<rand()%(i-1)+1<<' '<<i<<'\n';
    }
    for(int i=1;i<=m;i++){
        int op=rand()%4+1,x=rand()%n+1,y=rand()%n+1,z=rand()%20;
        if(op==1)cout<<1<<' '<<x<<' '<<y<<' '<<z<<'\n';
        else if(op==2)cout<<2<<' '<<x<<' '<<y<<'\n';
        else if(op==3)cout<<3<<' '<<x<<' '<<z<<'\n';
        else cout<<4<<' '<<x<<'\n';
    }
    return 0;
} 

验证码 3773。


by bingxin @ 2023-05-05 11:17:29

赞一个

改了一上午代码发现结果没取模


|