警示后人
查看原帖
警示后人
891963
0xyz楼主2023/4/26 12:53

因为 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。

2023/4/26 12:53
加载中...