CF 2001 E2 solution (967 Div.2)

CF 2001 E2

由于对称,所以设 heap[u] 为两次确定堆,且第一次弹出的是 uheap[u,v] 是第一次 u ,第二次 v

则答案就是 heap[u]=2n1·heap[x]

其中 x 任意。

不妨我们考虑第一次都是从第一个叶子弹出,那么对于其他不同的第二个弹出的点,根据对称性显然有如下性质:

LCA(u,v1)=LCA(u,v2)heap[u,v1]=heap[u,v2]

而经过手玩一下关系,可以发现:

5150c746-dbe9-4fd4-b3ef-c70d49092a1a

也就是设 L1,R1 是两个叶子的 LCA 的左右儿子,l,rL1 的左右儿子(图稍微画错了点)

容易得到:

{l+rL1r<l<R1<L1

而对于更上层的点,还是设当前点左右儿子是 L1,R1L1 的儿子是 l,r,则有:

{l+rL1l>R1r<lR1<L1

由 E1,我们求出了 fi,j:高为 i 的堆,操作 j 次,只弹出第一个叶子的方案数,以及 gi,j:操作 j 次的总局面个数

借用一张官解的图

我们会发现 L,RL 的时候,R 是普通子树,而 R 是一颗满足弹一次合法的子树。

所以 L 的方案数可以由符合条件的 L,RfL·gR 构成,而总的方案数需要再用 fR 进行合并。

而用 fR 合并的时候要乘上 2h2 因为叶子任选其一。

而也有可能自身不是 LCA,往上更新的时候直接算就行了,注意要拼上一个普通二叉堆个数。

所以可以设 dph,l,r 为高为 h 的树,左子树权值 l,右子树权值为 r 的方案数。

那么有:

dph,L1,R1=l=0R11r=0min(l1,L1l)fh2,l·gh2,r·fh1,R1·2h2+l=R1+1L11r=0min(l1,L1l)dph1,l,r·gh1,R1

可以利用前缀和优化到 O(nk2),例如前半部分,可以设 Sx,y=l,rfh2,l·gh2,r·[l+r=x][l=y][l>r],先做 y 这一维的前缀和,再做 x 这一维的前缀和即可。

后半部分同理。

code

posted @   spdarkle  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
历史上的今天:
2023-08-21 Codeforces Round 893 Div.2 A~E2
点击右上角即可分享
微信分享提示