2020牛客暑期多校训练营Tokens on the Tree(树形DP,树链剖分)

博客介绍了如何使用树形DP和树链剖分解决一个关于树上移动颜色块的问题。内容包括题目的描述、输入输出说明、分析过程以及代码实现。博主探讨了不同颜色块在树上的移动情况,并提出了解决方案,重点讲解了如何通过求树的重心和最长链来处理复杂情况。
摘要由CSDN通过智能技术生成

Tokens on the Tree

题目描述

在这里插入图片描述

输入描述:

在这里插入图片描述

输出描述:

在这里插入图片描述

示例1

输入

2
5
1 2 3 3
10
1 2 3 4 3 6 3 8 2

输出

71
989

说明

在这里插入图片描述

题目大意

给定一棵树,这棵树上有黑白两种颜色,白色和黑色节点各构成了一坨连通块,其中一个节点可以将其颜色转移到它所在的连通块的外面一圈。
再定义一个函数 f ( u , v ) f(u,v) f(u,v),如果一个连通块通过变换能使得这个块的两端互换位置,那么称这两个形态为同种形态。现要求对于所有的 u + v ≤ n u+v\le n u+vn n n n为树的大小,求 f ( u , v ) f(u,v) f(u,v)的和乘上颜色各自的数量 m o d   1 e 9 + 7 mod\,1e9+7 mod1e9+7

分析

首先剖析操作。想这样花里胡哨的描述,实际上是什么。其实就是一个连通块,它可以整块地在树上移动(或者用xinjun的话说是“蠕动”)。然后一团颜色在同一个区域里蠕动,算作一种。
一开始毫无头绪,所以不如先举几个例子来看看。
鲜艳起见,下文中使用红色和蓝色来表示黑和白。
在这里插入图片描述
我们来看上面的栗子。可以发现蓝色区域是无法移动的,由于红色区域大到占据了 k e y key key节点,即绿色节点。所以,一旦上面的情况发生,即如果红色的大到抢到了 k e y key key,那么就会造成蓝色只有待在一个地方不动。
那么这样的情况还是比较好处理的。只要找到树的 k e y key key,跑个树形 d p dp dp O K OK OK

但是有种情况比较麻烦。
在这里插入图片描述
这样的时候蓝色就是海阔天空了,它啥地儿都能到。但是一旦红色又堵住了蓝色的路,那么它又没有去处了。这样搞起来就比较棘手。怎么办呢?

那就要用到树剖了。不妨我们把蓝色看成是挡路的,那么如果红色要到另一边去,那么蓝色必定是要让开至少一个节点使得红色可以通过。比如,上图中,前一张图蓝色就让路了,但是后一张就没有。那么对于一棵树,我们考虑红色(假使它比较大),那么他肯定是要从左端到右端。那么怎么定义这个左右呢?显然,不能乱搞,我们要求出树的最长链,然后使一段为左另一端为右。
那么怎么求最长链,就可以求一下以树的重心为根的最长链和次长链,然后将它们连起来就可以了。于是就有一个美妙的解法。

首先,我们对这个树求重心,然后求出最长的链。那么我们只要在这条链上除了两端在中间找个子树把蓝色塞在里面,那么红色就可以通过了。

那么接下来我们想,解决了两种情况,那么分类讨论吗,好像无法分类啊。没问题,不用分类的。我们想,一旦红色占据了节点 k e y key key,不就转化为了上面的一种情况吗。那所以,两种情况是可以合在一起考虑的。

最后,综述一下这题应该怎么搞。首先枚举红色的大小,假定其大小大于蓝色,那么设大小为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值