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出手相助