ff
Solution
做法似乎和其他的题解不太一样。
我们考虑统计对于每一个点
我们将所有经过点
-
该路径只包含点
。 -
该路径的一个端点为点
,另外一个点是点 子树中的一个节点。 -
该路径的两个端点分别在
的两个不同的子树中。 -
该路径的一个端点在
以及其子树中,而另外一个端点在它祖先以及其子树中,但又不是 ,且不在 的子树中。
我们接下来对这几种路径分别进行求解。
我们假设当前点为
-
该路径只包含点
,很显然只有一种。 -
由于一个端点是
,另一个是在他的子树中,答案显然为 。 -
由于该路径的两个端点分别在
的两个不同的子树中,对于每一个 的贡献为 ,由于每一条路径会被统计两次,总的贡献为 。
Code
#include <iostream>
#include <algorithm>
#define ll long long
#define PLL pair<ll, ll>
#define inl inline
using namespace std;
const int N = 2e5;
ll n, k, ans[N + 5];
ll c[N + 5], siz[N + 5], mp[N + 5], pre[N + 5], cnt[N + 5], d[N + 5], s[N + 5];
int head[N + 5], ver[N * 2 + 5], nxt[N * 2 + 5], tot;
inl void add(int u, int v) { nxt[++tot] = head[u], head[u] = tot, ver[tot] = v; }
inl ll calc(ll x, ll y) { return !y ? s[x] : d[y]; }
inl void upd(ll x, ll y, ll w) { !y ? s[x] += w : d[y] += w; }
template <class _Tp>
inl void read(_Tp &x) {
x = 0;
char ch = getchar();
while (ch < '0' || ch > '9') ch = getchar();
while ('0' <= ch && ch <= '9') x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
}
inl void print(ll x) {
if (x > 9) print(x / 10);
putchar(x % 10 + '0');
}
inl void dfs1(int u, int fa) {
ll cur = mp[c[u]];
siz[u] = 1, pre[u] = mp[c[u]];
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (v != fa) mp[c[u]] = v, dfs1(v, u), siz[u] += siz[v];
}
mp[c[u]] = cur;
}
inl void dfs2(int u, int fa) {
ll res = 0;
for (int i = head[u]; i; i = nxt[i]) {
int v = ver[i];
if (v != fa) dfs2(v, u), ans[c[u]] += siz[v], res += siz[v] * (siz[u] - siz[v] - 1);
}
ans[c[u]] += res / 2, ans[c[u]] += (siz[pre[u]] - siz[u] - calc(c[u], pre[u])) * siz[u] + 1, upd(c[u], pre[u], siz[u]);
}
int main() {
read(n);
for (int i = 1; i <= n; i++) read(c[i]);
for (int i = 1, u, v; i < n; i++) read(u), read(v), add(u, v), add(v, u);
dfs1(1, 0), siz[0] = n, dfs2(1, 0);
for (int i = 1; i <= n; i++, putchar('\n')) print(ans[i]);
return 0;
}
本文来自博客园,作者:zhou_ziyi,转载请注明原文链接:https://www.cnblogs.com/zhouziyi/p/17205999.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具