【五校联考2015 9.5】送你一棵线段树
2015-09-07 21:47
239 查看
题目大意
你有nn棵树。每一棵树的形态如下给出:0号树T0T_0只有一个点,标号为0
对于第ii棵树Ti(i>0)T_i(i>0),它通过拷贝第AiA_i和BiB_i棵树,并将对应原树上的CiC_i号和DiD_i号节点链接一条LiL_i的边得到。并且新树上原本属于BiB_i节点的节点标号都加上了sizeAisize_{A_i}。
现在要求你计算每一棵树的这个值
∑i∈Ti∑j∈Tidis(i,j)\sum_{i\in T_i}\sum_{j\in T_i}dis(i, j)
其中dis(i,j)dis(i, j)表示树上点ii和点jj之间的最短路的长度。
n<60,Ai<i,Bi<i,Case<100n<60, A_i < i, B_i < i, Case<100
分析
不难发现最坏情况下,sizeTnsize_{T_n}是可以达到2n2^n的。我们先想一下如果我们要计算一棵树的答案需要知道些什么,很自然可以想到从这棵树的构成出发。它等于AiA_i的答案加上BiB_i的答案再加上跨过AiA_i和BiB_i的所有路径的长度,前两部分可以递归地算,主要是看后一部分。
后一部分显然等于
sizeAisumDi+sizeBisumCi+LisizeAisizeBisize_{A_i}sum_{D_i}+size_{B_i}sum_{C_i}+L_isize_{A_i}size_{B_i}
sizesize数组很好统计,主要是看如何计算sumsum。
考虑到每棵树上直接需要查询sumsum值的点顶多只有nn个,间接需要查询(即后面的树上的某个点属于前面某棵树上的点,我们依旧需要把它算出)的点顶多只有n2n^2个。
那么依照前面的思路,我们拆成两棵树来分别维护这些关键点的sumsum值,假设xx是TiT_i的关键点且x∈TAix\in T_{A_i}(x∈TBix\in T_{B_i}是同理的)。
sumTi,x=sumAi,x+[dis(Ci,x)+Li]sizeBisum_{T_i, x}=sum_{A_i, x}+[dis(C_i, x)+L_i]size_{B_i}
那么新的问题就出现了,我们还有维护关键点之间的disdis值。其实思路是同理的,就略推导的式子了。
最终的时间复杂度O(n3Case)O(n^3Case)
相关文章推荐
- Android 之数据存储--SharedPreferences
- Android数据存储
- 英文语句处理(空格处理)
- 关于synchronized关键字的一点补充
- win7配置sql server 2005数据库服务器
- 面试之简答题
- 赋值运算符的重载
- android 动画 从view顶部退出、进入(系列动画)
- 数据库学习
- Mifare系列5-存储结构(转)
- shell syntax error near unexpected token
- 阿里云盾网站安全防御(WAF)的使用方法(图文)
- centos下安装mysql
- Android数据存储——SDcard
- uC/OS--II的时间管理
- Linux-----Ubuntu搭建FTP服务器
- CCLight解析
- XAMPP Apache服务器解析php页面汉字乱码的解决
- CentOS 加载/挂载光驱
- 一个简单div+css来练习