样例不过求调
查看原帖
样例不过求调
831011
Deltary_楼主2024/10/25 20:56
#include<iostream>
#include<cstdio>
#include<vector>
using namespace std;
inline int read(){
	int x=0,f=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
	while(c<='9'&&c>='0') x=(x<<3)+(x<<1)+(c-48),c=getchar();
	return x*f; 
}
const int N=1e5+10;
int inv[N],fa[N],dep[N],dis[N];
int n,m;
vector <int> G[N];
int st[N][20];
void dfs(int u,int f,int d){
	fa[u]=f,dep[u]=d;
	st[u][0]=f;
	for(int i=1;i<=19;i++){
		st[u][i]=st[ st[u][i-1] ][i-1];
	}
	for(auto v:G[u]){
		if(v==f||v==u) continue;
		dis[v]=dis[u]+inv[u];
		dfs(v,u,d+1); 
	}
}
int lca(int x,int y){
	//1.make sure x is lower than y
	if(x==y) return x;
	if(dep[x]<dep[y]) swap(x,y);
	for(int i=19;i>=0;i--){
		if(dep[ st[x][i] ]<=dep[y]) x=st[x][i];
	} 
	if(x==y) return x;
	//2.jump more jump!
	for(int i=19;i>=0;i--){
		if(st[x][i]!=st[y][i]) x=st[x][i],y=st[x][i]; 
	}
	return st[x][0];
}
int main(){
	n=read(),m=read();
	for(int i=1;i<n;i++){
		int u=read(),v=read();
		inv[u]++,inv[v]++;
		G[u].push_back(v);G[v].push_back(u);
	}
	dfs(1,0,1);
	while(m--){
		int u=read(),v=read();
		int w=lca(u,v);
		cout<<dis[u]+dis[v]-2*dis[w]+inv[w]<<endl;
	}
//	for(int i=1;i<=n;i++) cout<<inv[i]<<" ";cout<<endl;
//	for(int i=1;i<=n;i++) cout<<dis[i]<<" ";cout<<endl;
	return 0;
}
2024/10/25 20:56
加载中...