WA on #5 #17 求调
查看原帖
WA on #5 #17 求调
1030785
wangtingmu楼主2024/3/16 13:01
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+1;
vector<int > tree[maxn];
int d[maxn],f[maxn][30];
int n,m;
void dfs(int fa,int deth,int now){
	if(fa!=-1){
		f[now][0]=fa;
		d[now]=deth;
		for(int i=1;pow(i,2)<=deth;i++) f[now][i]=f[f[now][i-1]][i-1];
	}
	for(int i=0;i<tree[now].size();i++) if(tree[now][i]!=fa) dfs(now,deth+1,tree[now][i]);
}
int work_(int x,int y){
	if(d[x]>d[y]) swap(x,y);//deth[x]<=deth[y]
	while(d[y]>d[x]) y=f[y][int(log2(d[y]-d[x]))];
	if(x==y) return x;
    for(int i=int(log2(d[x]));i>=0;i--){
    	if(f[x][i]!=f[y][i]){
    		x=f[x][i];
    		y=f[y][i];
    	}
    }
    return f[x][0];
}
int main()
{
	cin>>n;
	for(int i=1;i<=n-1;i++){
		int x,y;
		cin>>x>>y;
		tree[x].push_back(y);
		tree[y].push_back(x);
	}
	d[1]=0;
	dfs(-1,0,1);
	cin>>m;
	for(int i=1;i<=m;i++){
		int x,y;
		cin>>x>>y;
		int k=work_(x,y);
		//cout<<k<<endl;
		cout<<d[y]-d[k]+d[x]-d[k]+1<<endl;
	}
	return 0;
}
2024/3/16 13:01
加载中...