全蛙求调
查看原帖
全蛙求调
1100527
yoohoo楼主2024/7/11 21:13

emm

神奇的问题

样例能过

自己造的点也能过

但就是全蛙

想不通错在哪里了(或许是被卡了)

蒟蒻求调

#include <bits/stdc++.h>
using namespace std;
int a,b,c,zj=0,sd[10000000],die[10000000];//节点数   查询数   根节点  深度  谁走过了
int hand[10000010];//前向星表
int fa[1000000][30];//倍增寻找父节点
int t[10000000];//倍增深度
int dyg=0,drg=0,dsg=0;
int dyc=0,drc=0,dsc=0;
int zzz1=0,zzz2=0,zzz3=0;
struct aaa{
	int to;//指向谁
	int xyg;//下一个结构体是谁
}jl[10000000];
void find1(int i,int j){
	int g=sd[i];
	int h=sd[j];
	if(g>h){
		int u=g-h;
		int x=2,y=1;
		while(u>=x){
			x*=2;
			y++;
		}
		y--;
		dyc+=pow(2,y);
		find1(fa[i][y],j);
		return;
	}
	if(g<h){
		int u=h-g;
		int x=2,y=1;
		while(u>=x){
			x*=2;
			y++;
		}
		y--;
		dyc+=pow(2,y);
		find1(i,fa[j][y]);
		return;
	}
	if(i==j){
		dyg=i;
		return;
	}
	for(int k=t[j];k>=0;k--){
		if(fa[i][k]!=fa[j][k]){
			dyc+=pow(2,k+1);
			find1(fa[i][k],fa[j][k]);
			return;
		}
		if(k==0&&fa[i][k]==fa[j][k]){
			dyc+=2;
			dyg=fa[i][k];
			return;
		}
	}
}
void find2(int i,int j){
	int g=sd[i];
	int h=sd[j];
	if(g>h){
		int u=g-h;
		int x=2,y=1;
		while(u>=x){
			x*=2;
			y++;
		}
		y--;
		drc+=pow(2,y);
		find2(fa[i][y],j);
		return;
	}
	if(g<h){
		int u=h-g;
		int x=2,y=1;
		while(u>=x){
			x*=2;
			y++;
		}
		y--;
		drc+=pow(2,y);
		find2(i,fa[j][y]);
		return;
	}
	if(i==j){
		drg=i;
		return;
	}
	for(int k=t[j];k>=0;k--){
		if(fa[i][k]!=fa[j][k]){
			drc=pow(2,k+1);
			find2(fa[i][k],fa[j][k]);
			return;
		}
		if(k==0&&fa[i][k]==fa[j][k]){
			drc+=2;
			drg=fa[i][k];
			return;
		}
	}
}
void find3(int i,int j){
	int g=sd[i];
	int h=sd[j];
	if(g>h){
		int u=g-h;
		int x=2,y=1;
		while(u>=x){
			x*=2;
			y++;
		}
		y--;
		dsc+=pow(2,y);
		find3(fa[i][y],j);
		return;
	}
	if(g<h){
		int u=h-g;
		int x=2,y=1;
		while(u>=x){
			x*=2;
			y++;
		}
		y--;
		dsc+=pow(2,y);
		find3(i,fa[j][y]);
		return;
	}
	if(i==j){
		dsg=i;
		return;
	}
	for(int k=t[j];k>=0;k--){
		if(fa[i][k]!=fa[j][k]){
			dsc+=pow(2,k+1);
			find3(fa[i][k],fa[j][k]);
			return;
		}
		if(k==0&&fa[i][k]==fa[j][k]){
			dsc+=2;
			dsg=fa[i][k];
			return;
		}
	}
}
 void sss(int i,int j){
	int h=hand[i];
	while(h>0){
		if(die[jl[h].to]==0){
			fa[jl[h].to][0]=i;
			sd[jl[h].to]=j+1;
			die[jl[h].to]=1;
			sss(jl[h].to,j+1);
		}
		h=jl[h].xyg;
	}
	return;
} 
int main() {
	ios::sync_with_stdio(0);
	cin.tie(nullptr) -> sync_with_stdio(false);
	cin>>a>>b;
	sd[1]=1;
	die[1]=1;
	for(int i=1;i<a;i++){
		int x,y;
		cin>>x>>y;
		zj++;
		jl[zj].to=y;
		jl[zj].xyg=hand[x];
		hand[x]=zj;
		zj++;
		jl[zj].to=x;
		jl[zj].xyg=hand[y];
		hand[y]=zj;
	}
	sss(1,1);
	for(int i=1;i<=1000000;i++){
		int p=0;
		for(int j=1;j<=a;j++){
			fa[j][i]=fa[fa[j][i-1]][i-1];
			if(fa[j][i]==0)t[j]=i-1;
			p=max(p,fa[j][i]);
		}
		if(p==0)break;
	}
	for(int i=1;i<=b;i++){
		int x,y,z;
		cin>>x>>y>>z;
		dyc=0;
		drc=0;
		dsc=0;
		zzz1=0;
		zzz2=0;
		zzz3=0;
		find1(x,y);
		find2(y,z);
		find3(x,z);
		if(dyg==drg)cout<<dsg<<' ';
		else if(dyg==dsg)cout<<drg<<' ';
		else cout<<dyg<<' ';
		int h=max(max(sd[dyg],sd[drg]),sd[dsg]);
		int n1,n2,n3,m1,m2,m3;
		n1=sd[x];
		n2=sd[y];
		n3=sd[z];
		m1=n1-h;
		m2=n2-h;
		m3=n3-h;
		if(m1<0)m1=-m1;
		if(m2<0)m2=-m2;
		if(m3<0)m3=-m3;
		cout<<m1+m2+m3<<endl;
	}
	cout<<endl;
	return 0;
}

感谢各位dalao出手相助

2024/7/11 21:13
加载中...