Are you going to Scarborough F|
2023-09-27 20:30阅读: 44评论: 0推荐: 0

[题解] CF1882D - Tree XOR

CF1882D - Tree XOR

知识点:换根 DP 。

主要难点是要思考如何操作使得代价最小,这个过程是一个贪心的过程。想到怎么操作,计算答案的过程就是一个板子换根了。

题意

给定一颗 n 个节点的树,点 i 具有权值 ai 。现在需要你不断执行以下操作,使得树上所有点的权值相等。

  • 记当前根节点为 root ,一次操作中,可以选择一个点 v 和任意整数 c ,将 v 子树内所有节点的权值异或 c ,代价为一次异或的节点数量。

问当根节点为 root=1,2,,n 时,使得树上所有节点权值相等的最小代价为多少。

思路

假设我们现在选择一个点 v ,我们要对其进行操作。如果其子树内存在节点,权值不等于 av ,那么意味着我们无论怎么操作,都不可能使得树上所有点相等。

因此,如果如此递归考虑,那么我们每次执行操作,必然是从叶子节点到根节点,每次操作都是让当前节点 u 子树的所有节点权值改为 au ,直到最后的根节点,这样代价才能达到最小。

vu 的儿子节点,那么按照我们上述所说的思路,这次操作的代价应该为 costv+sizev×(auav) ,其中 costv 是将 v 的所有子树节点权值更改为 av 的代价。

但是,我们现在考虑的代价只是以一个根节点进行考虑的,并不是 n 个根节点轮流的情况,此时我们可以考虑,在计算了一个根节点的情况上,计算这个节点是根节点的代价,也就是换根 dp 。

f(x)=costx ,表示在根节点为 root 的情况下(不妨设 root=1 ),将 x 的所有子树节点权值改为 ax 的代价; g(x) 为把除了 x 的子树以外的节点权值改为 ax 的代价。那么,f(x) 的状态方程即为:

f(u)=f(v)+sizev×(auav)

对于 g(x) ,我们使用换根 dp 经典的计算方式即可。

g(v)=f(u)f(v)sizev×(auav)+g(u)+(nsizev)×(auav)

最后计算结果,ans(x)=f(x)+g(x)

实现

auto Main() -> void {
int n;
std::cin >> n;
std::vector<i64> vw(n);
for (auto &x : vw) {
std::cin >> x;
}
std::vector adj(n, std::vector<int>{});
for (int i = 0; i < n - 1; i ++) {
int u, v;
std::cin >> u >> v;
u --; v --;
adj[u].emplace_back(v);
adj[v].emplace_back(u);
}
std::vector<int> siz(n);
std::vector<i64> dp1(n), dp2(n);
auto dfs1 = [&](auto &self, int from, int come) -> void {
siz[from] = 1;
for (auto to : adj[from]) {
if (to == come) {
continue;
}
self(self, to, from);
siz[from] += siz[to];
dp1[from] += dp1[to] + (i64(vw[from] ^ vw[to]) * siz[to]);
}
};
dfs1(dfs1, 0, -1);
auto dfs2 = [&](auto &self, int from, int come) -> void {
if (come != -1) {
dp2[from] = dp1[come] - dp1[from] - (i64(vw[come] ^ vw[from]) * siz[from]) + dp2[come] + (i64(vw[from] ^ vw[come]) * (n - siz[from]));
}
for (auto to : adj[from]) {
if (to != come) {
self(self, to, from);
}
}
};
dfs2(dfs2, 0, -1);
for (int i = 0; i < n; i ++) {
std::cout << dp1[i] + dp2[i] << " \n"[i + 1 == n];
}
}

本文作者:FlandreScarlet

本文链接:https://www.cnblogs.com/FlandreScarlet/p/17734262.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   フランドール·スカーレット  阅读(44)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 Scarborough Fair 山田タマル
  2. 2 Faster Than Light Paradox Interactive,Andreas Waldetoft
  3. 3 世界は可愛く出来ている 上海アリス幻樂団
Faster Than Light - Paradox Interactive,Andreas Waldetoft
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作曲 : Andreas Waldetoft

Stars in the sky

Floating in darkness

Soon I will fly

Faster than Light

See through my eyes

Time standing down

Onward to space

Engines Stand By

Sense loss of time

Nebula’s blurring

Lights flashing by

Worlds Unknown

Imminent approach

Sensors reacting

Anon I’m through

Faster Than Light

Suddenly stop

Readings come in

Nothing in sight

Sun glowing bright

Stars in my view

Floating in darkness

Soon I'll go through

Faster than Light