Bubble Cup 9 - Finals [Online Mirror] 题解

A. Festival Organization

很显然,设 fi 表示长度为 i 的满足条件的01串个数,那么有:

fi=fi1+fi2,f1=2,f2=3

这只是将传统的 fib 序列左移了一下,反正答案是形如 solve(r)solve(l1) 的,因此将 l,r 分别加 2 当作fib来做就可以了,以下的 fi 均表示下标从 1 开始的fib序列。
考虑我们现在要求的就是这样一个前缀和:
i=1n(fik)

看上去就好难的说,我们考虑一下 (xk) 其实就是变量为 x 的一个k次多项式,因此我们可以求出每项前面的系数 ai ,然后我们的任务就变成了求出:
i=0kaij=1nfij

所以我们现在的目的就是要求对于一个固定的 i nj=1fij的值。
这个东西的计算方法我们考虑 fib 的通项:
fn=15(1+52)n(152)n

φ=1+52 ,那么原式就是:
fn=φn(φ)n51+52152=1

考虑 fij 怎么求,其实很简单,还记得复数是怎么表示的么,我们用 a+bi 来表示,那么这里我们可以用 a+b5 来表示值,然后重定义加减乘除即可,这个就是很简单的了。
现在我们考虑怎么求 fij 的前缀和,根据二项式定理展开 fn 的分子,然后第 x 项形如:
(ix)φjx((φ)j)ix

虽然有点小复杂, 但是可以看出 j 1n这个东西构成了一个等比数列,简单讨论一下正负号然后等比数列求和即可。
注意公比为 1 要特判。

B. R3D3’s Summer Adventure

很显然这是一棵树,而且01个数是相同的。
想一下如果要求 O(nlogn) 做法的话,我们有一个很好的贪心做法,就是最开始一棵空树,然后每次选权值最小的链,将其扩展出两个孩子。
仔细思考一下这个做法,我们发现假如我们给树上每个节点的权值定义为到根权值和,那么除去所有的叶子结点,其他的非叶子结点可以看成是权值从小到大依次出现的,因为根据前面的那个贪心做法,我们是从小到大扩展了所有的非叶子结点。
那么考虑非叶子结点权值和,假设根节点权值为 0 ,那么还要加上(n1)(c0+c1)才能满足要求(因为考虑以某个节点为根的子树,那么他自己的贡献被计算了子树大小次,然而叶子结点是=非叶子结点+1的,因为这个1的差距我们要加上这个东西)。
那么现在我们的问题就是求出权值从小到大的 n1 个点的和即可,假设 c0<c1
考虑二分一下最大的权值,假设为 C ,求出所有C的结点个数,找到第一个 n1 的即可。
根据贪心原理,那么一条链上 c1 的个数 i 不会超过log2n,因此我们可以枚举 c1 的个数,然后求出 c0 个数的上界 j=Cic1c0 ,求出这个东西:

calc(C)=i=0log2nk=0j(i+ki)=i=0log2n(i+j+1i+1)

求出了最大权值 max 后,那么我们的答案就分成了两部分,一部分是等于 max 的,另一部分是小于 max 的。
等于的很好算,就是 (n1calc(max1))max
考虑小于的,可以写成:
i=0log2nk=0j(ic1+kc0)(i+ki)=c1i=0log2ni(i+j+1i+1)+c0i=0log2n(i+1)(i+j+1i+2)

嗯,就是这样了。

C. Potions Homework

排序即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值