玄关求调
  • 板块学术版
  • 楼主hank0920
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/11/24 19:30
  • 上次更新2024/11/24 20:58:15
查看原帖
玄关求调
916636
hank0920楼主2024/11/24 19:30

题目传送门

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e6 + 7;

int n, m, fa[N][35], dep[N], cf[N], ans;
vector<int> T[N];

void dfs(int u, int F){
	dep[u] = dep[F] + 1;
	for(int i = 1; i <= log2(dep[u]); i ++){
		int v = fa[u][i - 1];
		fa[u][i] = fa[v][i - 1];
	}
	for(int v : T[u]){
		if(v == F)	continue;
		fa[v][0] = u;
		dfs(v, u);
	}
}

void cur(int u, int F){
	for(int v : T[u]){
		if(v == F) continue;
		dfs(v, u);
		cf[u] += cf[v];
	}
}

int lca(int u, int v){
	if(u == v)	return u;
	if(dep[u] < dep[v])	swap(u, v);
	int d = dep[u] - dep[v];
	for(int i = 0; i <= log2(d); i ++){
		if(d >> i & 1){
			u = fa[u][i];
		}
	}
	if(u == v)	return u;
	for(int i = log2(dep[u]); i >= 0; i --){
		if(fa[u][i] != fa[v][i]){
			u = fa[u][i];
			v = fa[v][i];
		}
	}
	return fa[u][0];
}

void solve(){
	cin >> n >> m;
	
	for(int i = 1; i < n; i ++){
		int u, v;
		cin >> u >> v;
		T[u].push_back(v);
		T[v].push_back(u);
	}
	dfs(1, 0);
	
	for(int i = 1; i <= m; i ++){
		int u, v; cin >> u >> v;
		cf[u] ++, cf[v] ++, cf[lca(u, v)] -= 2;
	}
	
	cur(1, 0);
	
	for(int i = 2; i <= n; i ++){
		if(cf[i] == 0){
			ans += m;
		}
		else if(cf[i] == 1){
			ans ++;
		}
	}
	
	cout << ans;
}

signed main()
{
	ios :: sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr);
	solve();
	return 0;
}

10pts 实在找不出错误来了,求调

2024/11/24 19:30
加载中...