“我们会死很久,所以活着的时候一定要很开心|

jxy2012

园龄:1年2个月粉丝:1关注:2

题解:P7143 [THUPC2021 初赛] 线段树

点此看题面

  • 对于一个长度为 n 的序列建出一棵标准线段树,定义一个区间的权值为至少用线段树上多少个节点才能恰好表示出这个区间。

  • 求所有区间的权值之和。

  • 数据组数 103,n1018

计算点的贡献

考虑一个区间对应的节点个数,就是把这个区间扔到线段树上时,节点裂开的次数加一(显然一次裂开会增加一个点,加一是因为最初有一个点)。

所以我们考虑计算每个点裂开的方案数,这就等价于求有多少个区间跨越这个节点的中点且不完全包含这个节点。

动态规划

假设一个节点在原序列中对应区间的左边有 l 个位置,右边有 r 个位置,并设这个点两个儿子对应区间大小分别为 lsrs

那么能使得这个点裂开的区间可以分成三类:被这个点包含、完全包含左儿子、完全包含右儿子。

总计算式就应该是 (ls×rs1)+l×(rs1)+r×(ls1)

现在我们想 DP 这玩意,lsrs 是可以根据当前节点对应区间大小 n 直接计算的,且由于这是一棵标准线段树,可能的区间大小只有 O(logn) 种,可以计入状态。但如果我们把 lr 一同维护进状态里显然爆炸。但根据我们之前总计算式的形式,发现一个点的贡献可以表示为 a+l×b+r×c。所以我们设 Fn,Ln,Rn 表示一个大小为 n 的节点整棵子树的贡献为 Fn+l×Ln+r×Rn。从左子节点向上转移的贡献为 Fls+l×Lls+(r+rs)×Rls,即 (Fls+rs×Rls)+l×Lls+r×Rls,依然可以保持这个形式不变,右子节点向上转移同理。

本文作者:jxy2012

本文链接:https://www.cnblogs.com/jxy2012/p/18272138

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

posted @   jxy2012  阅读(9)  评论(0编辑  收藏  举报
//雪花飘落效果
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起