全部评论 2

  • #include<iostream>
    #include<vector>
    
    using namespace std;
    
    const int N = 1e6 + 10;
    int n, q, u, v, a[N], fa[N][20], dep[N], cnt;
    vector<int> g[N];
    
    void dfs(int u, int f){
    	fa[u][0] = f;
    	dep[u] = dep[f] + 1;
    	for(int i = 1; i < 20; i++) fa[u][i] = fa[fa[u][i-1]][i-1];
    	for(int v: g[u]){
    		if(v == f) continue;
    		dfs(v, u);
    	}
    }
    
    int lca(int u, int v){
    	if(dep[u] < dep[v]) swap(u, v);
    	for(int i = 19; i >= 0; i--){
    		if((dep[u] - dep[v]) & (1 << i)) u = fa[u][i];
    	}
    	if(u == v) return u;
    	for(int i = 19; i >= 0; i--){
    		if(fa[u][i] != fa[v][i]) u = fa[u][i], v = fa[v][i];
    	}
    	return fa[u][0];
    }
    
    void get_ans(int u, int f){
    	for(int v: g[u]){
    		if(v == f) continue;
    		get_ans(v, u);
    		a[u] += a[v];
    	}
    }
    
    int main(){
    	cin >> n >> q;
    	for(int i = 1; i < n; i++){
    		cin >> u >> v;
    		g[u].push_back(v);
    		g[v].push_back(u);
    	}
    	dfs(1, 0);
    	while(q--){
    		cin >> u >> v;
    		int w = lca(u, v);
    		a[u]++; a[v]++;
    		a[w]--; a[fa[w][0]]--;
    	}
    	get_ans(1, 0);
    	cin >> u >> v;
    	int w = lca(u, v);
    	while(u != w){
    		if(a[u] == 0) cnt++;
    		u = fa[u][0];
    	}
    	while(v != w){
    		if(a[v] == 0) cnt++;
    		v = fa[v][0];
    	}
    	if(a[u] == 0) cnt++;
    	cout << cnt;
    	return 0;
    }
    
    
    

    2025-09-14 来自 福建

    0
  • 原题就不要发了吧

    2025-09-13 来自 江西

    0

热门讨论