听取WA声一片,求调
查看原帖
听取WA声一片,求调
1024631
Howells楼主2025/6/18 20:46

测试点跳转

#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1000010;
int n, A, s, fa[MAXN][20]={{0}}, dep[MAXN], sum[MAXN] = {0}, ans=0;
vector <int> edge[MAXN];


void dfs(int node, int father){
	dep[node] = dep[father] + 1;
	fa[node][0] = father;
	for (int i=1;i<20;++i) {
		fa[node][i] = fa[fa[node][i-1]][i-1];
	}
	for (auto son : edge[node]){
		if (son != father) dfs(son, node);
	}
}


int lca(int node1, int node2){
	if (dep[node1] < dep[node2]) swap(node1, node2);
	for (int i=19;i>=0;i--){
		if ((dep[node1] - dep[node2]) & (1 << i)) {
			node1 = fa[node1][i];
		}
	}
	if (node1 == node2) return node1;
	for (int i=19;i>=0;i--){
		if (fa[node1][i] != fa[node2][i]){
			node1 = fa[node1][i];
			node2 = fa[node2][i];			
		}
	}
	return fa[node1][0];
}


void adder(int node, int father){
	for (auto son : edge[node]){
		if (son != father){
			adder(son, node);
			sum[node] += sum[son];
		}
	}
}


int main(){
	cin>>n>>A;
	for (int i=1;i<n;++i){
		int u, v;
		cin>>u>>v;
		edge[u].push_back(v);
		edge[v].push_back(u);
	}
	dep[0] = 0;
	dfs(0, 0);
	for (int i=1;i<=A;++i){
		int a, b;
		cin>>a>>b;
		int lca_ab = lca(a, b);
		sum[a]++;
		sum[b]++;
		sum[lca_ab]--;
		sum[fa[lca_ab][0]]--;
	}
	adder(1, 0);
	int badA, badB;
	cin>>badA>>badB;
	int bad_lca = lca(badA, badB);
	while (badA != bad_lca){
		if (sum[badA] == 0){
			ans++;
		}
		badA = fa[badA][0];
	}
	while (badB != bad_lca){
		if (sum[badB] == 0){
			ans++;
		}
		badB = fa[badB][0];
	}
	if (fa[bad_lca] == 0){
		ans++;
	}
	cout<<ans;
	return 0;
}

2025/6/18 20:46
加载中...