ABC298Ex Sum of Min of Length 题解

ABC298Ex

简单题。

因为有 min 不好做,容易想到讨论 d(i,L)d(i,R) 的大小。

p=LCA(L,R)depL>depR,dist=depL+depR2×deppnow 满足 depLdepnow=dist2

L 一定在 now 的子树内,且对于 i{subtree(now)} 时均有 d(i,L)d(i,R),否则 d(i,L)>d(i,R)。其中 subtree(x) 表示 x 的子树。

容易想到求一个点到其他点的距离和。

vali 表示 j=1nd(i,j)

在 dfs 时处理一下即可,显然可以做到 O(n)

最后再将 dist 奇偶讨论一下即可。

时间复杂度:O(n+mlogn),可以使用线性 LCA 做到 O(n+m)

代码:

const int N = 2e5 + 10;
int n, m;
int siz[N], d[N], fa[N][20];
ll dis[N], v[N];
vector<int> e[N];

void dfs1(int u, int f) {
	d[u] = d[f] + 1, siz[u] = 1, fa[u][0] = f;
	for (int i = 1; i <= 18; i++)
		fa[u][i] = fa[fa[u][i - 1]][i - 1];
	for (int v : e[u])
		if (v != f) {
			dfs1(v, u);
			siz[u] += siz[v];
			dis[u] += dis[v] + siz[v];
		}
}
void dfs2(int u, int f) {
	if (u == 1)
		v[u] = dis[u];
	else
		v[u] = v[f] + (siz[1] - siz[u]) - siz[u];
	for (int v : e[u])
		if (v != f)
			dfs2(v, u);
}
int lca(int u, int v) {
	if (d[u] < d[v])
		swap(u, v);
	for (int i = 18; i >= 0; i--)
		if (d[fa[u][i]] >= d[v])
			u = fa[u][i];
	if (u == v)
		return u;
	for (int i = 18; i >= 0; i--)
		if (fa[u][i] != fa[v][i])
			u = fa[u][i], v = fa[v][i];
	return fa[u][0];
}
int tonode(int u, int st) {
	for (int i = 18; i >= 0; i--)
		if (st >> i & 1)
			u = fa[u][i];
	return u;
}

int main() {
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cin >> n;
	for (int i = 1, u, v; i < n; i++) {
		cin >> u >> v;
		e[u].pb(v), e[v].pb(u);
	}
	dfs1(1, 0), dfs2(1, 0);
	cin >> m;
	while (m--) {
		int l, r;
		cin >> l >> r;
		if (d[l] < d[r])
			swap(l, r);
		int p = lca(l, r), dist = d[l] + d[r] - 2 * d[p];
		if (dist % 2 == 0) {
			int now = tonode(l, dist / 2);
			cout << v[l] + v[r] - v[now] - 1ll * n * dist / 2 << "\n";
		} else {
			int now = tonode(l, dist / 2);
			cout << v[l] + v[r] - v[now] - 1ll * n * (dist / 2) - siz[now] << "\n";
		}
	}
	return 0;
}
posted @   Pengzt  阅读(16)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示