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
赞一个
改了一上午代码发现结果没取模