P6453 [COCI2008-2009#4] PERIODNI

传送门

一道笛卡尔树的经典题。

我们用样例解释:

5

2 3 1 2 4

如图所示

我们可以建一棵笛卡尔树使hi满足小根堆性质,i满足二叉树性质

这棵笛卡尔树使这个直方图分成若5个矩阵,笛卡尔树上的每一节点代表一个矩阵,矩阵x的长就是以x点为根的子树大小sizx,高度就是hxhfax,这道题就转化成了树形DP问题了。

fi,j表示以i为根的子树放了j个相同的数的合法方案数

gi,j表示只在i的儿子所在的子树中放j个相同的数的合法方案数

则有:

{gi,j=k=0jfls,kfrs,jkfi,j=p=0jgi,pCsizipjpChihfaijpAjpjp

解释:笛卡尔树的每个节点最多只有两个儿子,所以用算gi,j时左儿子乘右儿子就可以了。

gi,p就是从节点i的儿子中放p个相同的数的方案数

Csizipjp因为从节点i的儿子中选了p个相同的数,而每个相同的数不能同列,所以这p个数必然使用了p行,所以要从剩下sizip行中选出jp行用来放相同的数

Chihfaijp因为不管选哪一列都不会跟它的儿子在同一行,所以可以从hihfaijp列放相同的数(不必管是否会在同一列,那是Csizipjp考虑的事)

Ajpjp因为选出了jpjp列,我们在选出的1行可以选择将数放在jp列中的任意一列,而选出的第二行可以选择将数放在jp1列中的任意一列,以此类推,有Ajpjp中方案

计算答案:

输出frt,k,其中rt时树根,k是要放的相同的数的个数

时间复杂度:

O(nk2)

posted @   傻阙的缺  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示