LCA模板调疯了,一直RE返回3221225725
查看原帖
LCA模板调疯了,一直RE返回3221225725
382484
__lyc_楼主2023/5/16 20:32
#include<bits/stdc++.h>
#define uns unsigned
using namespace std;
const uns N=5e5+5;
uns a,b,c,d,e,yu=0,cnt=0,cntt;
struct zhi{
	uns de;
	uns yz;
}l[N];
uns lg[N];
uns node[N];
unsigned de[N];
uns zx[N][25];
struct lian{
	uns dn,nxt;
}n[N*2];
int y[N];
int x[N];
uns fa[N];
bool cmp(zhi a,zhi b){
	return a.de<b.de;
}
void chest(uns a,uns b){
	if(y[a]!=0){
		n[x[a]].nxt=++cntt;
		n[cntt].dn=b;
		x[a]=cntt;
	}
	else{
		y[a]=++cntt;
		n[cntt].dn=b;
		x[a]=cntt;
	}
	return;
}
void chey(uns now,uns last){
	fa[now]=last;
	uns t;
	de[now]=de[last]+1;
	for(uns t=y[now],i=1;i<=node[now];t=n[t].nxt,i++){
		if(n[t].dn!=last){
			chey(n[t].dn,now);
		}
	}
	return ;
}
int main(){
	cin>>a>>b>>c;
	fa[c]=c;
	for(uns i=1;i<=a-1;i++){
		cin>>d>>e;
		chest(d,e);
		chest(e,d);
		node[d]++;
		node[e]++;
	}
	chey(c,c);
	for(int i=2;i<=a;i++){
		lg[i]=lg[i>>1]+1;
	}
	for(uns i=1;i<=a;i++){
		l[i].yz=i;
		zx[i][0]=fa[i];
	}
	sort(l,l+a+1,cmp);
	for(int i=1;i<=a;i++){
		for(uns j=1;j<=lg[de[l[i].yz]];j++){
			zx[l[i].yz][j]=zx[zx[l[i].yz][j-1]][j-1];
		}
	}
	for(int i=1;i<=b;i++){
		cin>>d>>e;
		if(de[e]<de[d]){
			swap(e,d);
		}
		while(de[e]!=de[d]){
			e=zx[e][lg[de[e]-de[d]]];
		}
		if(e==d){
			printf("%d\n",e);
		}
		else{
			for(uns j=lg[de[e]];j>=0&&j<4e9;j--){
				if(zx[e][j]!=zx[d][j]){
					e=zx[e][j];
					d=zx[d][j];
				}
			}
			printf("%d\n",fa[e]);
		}
	}
}

前两个点AC,后面全部RE现在只求告诉我为什么chey函数会崩溃然后返回3221225725

2023/5/16 20:32
加载中...