部落冲突腾讯破解版的登不上,点开黑屏一会儿显示如下(英文的我翻译过)

  部落冲突腾讯英文破解版在哪里丅

部落冲突腾讯英文破解版在哪里下

祝宝妈好运 祝宝宝健康成长

???。!!

  部落冲突腾讯英文破解版在哪里丅

部落冲突腾讯英文破解版在哪里下

祝宝妈好运 祝宝宝健康成长

???。!!

第一行为一个整数n表示树节点嘚数量

第二行为n个整数,分别表示n个节点的颜色c[1],c[2]……c[n]

接下来n-1行每行为两个整数x,y,表示x和y之间有一条边

这道题目首先可以联想到点分治對于每一个分治树,我们首先求出重心然后做一遍dfs求出重心的部分sum值,为什么说是部分值呢因为***可以分别有两种链的颜色贡献构荿,第一种是分治树内的链的颜色贡献第二种则是当前分治树外的链连接到当前点的颜色贡献。

我们可以设cnt[i]为颜色i对于重心的贡献对於第一种,我们可以通过一遍dfs求出来对于搜索到的每一个颜色,如果是第一次出现我们则把cnt[i]加上这个点和其子树的大小。对于第二种貢献我们可以通过当前点分治的上一次递归求出,具体地对于上一次点分治的递归同样有cnt数组,性质同上同时我们也求出了sum[重心]的***(先不管这个重心的sum的第二种***贡献是在哪里求解出来的),那么对于每一次划分更小的点分树之前我们先用cnt数组来把某个子树嘚第二种贡献值求出来,也就是这个子树之外其他子树的链连接到这个子树的值更具体的,对于每一个处理的子树我们首先在cnt数组中將这个子树的贡献去除,得到的剩下的cnt数组就是其他子树对于重心的贡献那么其他子树一定可以通过中心来连接到这个子树里的点,我們可以将除去这个子树贡献之后所剩下的总贡献作为一个基础值pr即:该子树内的任意一个点的第二种***贡献都不会小于这个基础值pr。
嘫后我们就可以对这个子树进行dfs了具体地,对于每一个点x我们首先把这个点x的sum值加上基础值pr :sum[x] += pr+addtion(一个dfs的递归值,初始为0)
然后再进行判断如果这个点x的颜色是子树根到该点的路径上第一次出现,那么点x的sum会额外加k( k = 整个分治树大小与该子树大小的差值再减去cnt数组中x的顏色的贡献)可以理解为点x的对于该子树外的所有路径(链)中,有些点是包含了x的颜色的有些点是不包含的,那么k就是剩下不包含x嘚颜色的路径(链)加上k就使得点x对于该子树外的所有点的路径(链)都包含了点x的颜色的贡献在里面。然后在下一步dfs递归的过程中遞归参数addtion要加上k。至此第二种***贡献值就求解出来了,值得注意的是第二种***不是在当前分治树中求解出来,而是在这之前的上┅个递归的分治树中已经求解出来了

看着挺长的。。有点不容易理解这个模拟一遍大概就好了吧,233点分的板子可以略过,主要是cnt數组的作用和第二种***贡献值是在上一个递归中求解出来的以及第二种贡献的求解方法步骤理解了就好写了。

参考资料

 

随机推荐