#P12669. 「TFXOI Round 2」最小价值最大树

    ID: 14021 远端评测题 2000ms 512MiB 尝试: 0 已通过: 0 难度: 5 上传者: 标签>贪心洛谷原创O2优化树形 DP位运算

「TFXOI Round 2」最小价值最大树

题目背景

本题征求时间复杂度低于 O(n2)O(n^2) 的做法,若有人成功,请联系题目提供者

数据生成器在附件,运行前需要先将 std.cpp 编译为名为 std 的可执行文件

公元前 278 年的今天,伟大的诗人屈原投汨罗江自尽,距今已有 2303 年。

有一颗江边的树想要纪念他,所以请你来对这棵树做一些装饰。

题目描述

有一个 nn 个点的树,点的编号从 11nn

ii 个点的点权是 aia_i

定义 f(x,y)=x(xy)f(x,y) = x \land (x \oplus y)

定义 all(i)all(i) 为点 ii 的所有能通过一条边到达的点的集合。

定义如下操作:

先选定一个点 ii,以及一个其直接连接的点集 sall(i)s \subseteq all(i)
然后,收益加上 $\sum\limits_{v\in s}f(a_i,a_v) - \sum\limits_{v\in all(i)}(a_v\land a_i)$。
然后,ai0a_i \leftarrow 0

定义树的价值为对其执行任意次以上操作能获得的最大收益(假设一开始收益为 00,上述操作仅用于定义树的价值,不会真的执行)。

定义森林的价值为其中所有树的价值的总和减去附加代价,森林中的两个点属于同一棵树,当且仅当两个点之间存在一条路径连接。

一开始,附加代价等于 00

你可以执行以下两种操作,其中第一种操作次数没有限制,第二种操作最多执行 kk 次:

  1. 选定两个点 u,vu,v,使得 u,vu,v 之间有直接连边,令 x=au,y=avx=a_u,y=a_v,附加代价减去 x+yx+y,然后将 u,vu,v 之间的边断开。
  2. 选定一个点 uu,将 uu 点删除,并断开 uu 连接的所有边。

答案为经过上述操作之后,题目给定的树形成的森林的最小价值。

你需要对于 k[0,lim]k \in [0,lim] 都计算出这个答案。

注释一:aba \land b 的意思是 aabb 的按位与值

注释二:aba \oplus b 的意思是 aabb 的按位异或值

注释三:a0a \leftarrow 0 的意思是将 aa 赋值为 00

输入格式

第一行两个以空格分开的整数,分别是 nnlimlim

第二行共 nn 个以空格分开的整数,代表 a1,a2,,ana_1,a_2,\cdots,a_n

接下来 n1n-1 行,每行两个以空格分开的整数 u,vu,v,代表 u,vu,v 之间存在一条边。

输出格式

输出一行 lim+1lim+1 个由空格隔开的整数,分别代表 k=0,1,2,,limk=0,1,2,\cdots,lim 的答案。

5 3
1 4 5 1 4
1 2
2 3
3 4
4 5
15 6 0 0 

提示

对于 C++ 语言,答案可能会超过 long long 范围,请使用 128 位整型,或者其他高精度

对于全部的数据:0limn20000 \le lim \le n \le 2000i[1,n],0ai2631\forall i \in [1,n],0 \le a_i \le 2^{63}-1,详细数据范围见下表。
| Subtask 编号 | 特殊限制 | 分值 | | :----------: | :--------------: | :----:| | #1 | lim=0,n10lim=0,n\le 10 | 1010 | | #2 | lim=0,n20lim=0,n \le 20 | 1515 | | #3 | lim=0lim=0 | 2020 | | #4 | n6n\le 6 | 1515 | | #5 | n100n \le 100 | 3030 | | #6 | 无 | 1010 |