请求加强数据呀
查看原帖
请求加强数据呀
174683
红尘仙楼主2021/10/4 17:19

因为受到 P2680 的影响,树链剖分写挂,LCA暴跳得了80分 , 于是来试试 LCA 这个板子题用暴跳多少分,结果直接过了。故请求加强一下数据吧

//
/*
Author : Zmonarch
Knowledge :
*/
#include <bits/stdc++.h>
#define int long long
#define inf 2147483647
using namespace std ;
const int N = 1e6 + 10 ;
int read() {
	int x = 0 , f = 1 ; char ch = getchar() ;
	while(!isdigit(ch)) {if(ch == '-') f = - 1 ; ch = getchar() ;}
	while( isdigit(ch)) {x = x * 10 + ch - '0' ; ch = getchar() ;}
	return x * f ;
}
int n , m , rt , cnt ;
int dep[N] , f[N] ; 
vector <int> E[N] ;
void add(int u , int v) {
	E[u].push_back(v) ; 
	E[v].push_back(u) ; 
}
void dfs(int u , int fa) {
	dep[u] = dep[fa] + 1 ; f[u] = fa ; 
	for(int i = 0 ; i < E[u].size() ; i++) 
	{
		int v = E[u][i] ; 
		if(v == fa) continue ; 
		dfs(v , u) ; 
	}
}
int Query(int u , int v) {
	while(u ^ v) 
	{
		if(dep[u] < dep[v]) swap(u , v) ; 
		u = f[u] ; 
	}
	return dep[u] > dep[v] ? u : v ; 
}
signed main() {
	n = read() , m = read() , rt = read() ; 
	for(int u , v , i = 1 ; i <= n - 1 ; i++) 
	 u = read() , v = read() , add(u , v) ; 
	dfs(rt , 0) ; 
	for(int u , v , i = 1 ; i <= m ; i++) 
	 u = read() , v = read() , printf("%lld\n" , Query(u , v)) ;
	return 0 ;
}
2021/10/4 17:19
加载中...