正睿 2019 省选十连测 Day3 T3 全排列

首先考虑给定一个排列,我们怎么算它几次会被消掉。
考虑这个排列的笛卡尔树(权值满足大根堆),那么当一个数它的左子树或者右子树都被消掉的时候,
它就会和它的祖先直接相邻,也就是一个比它大的数。
所以记dp[x]表示笛卡尔树中x这个点的子树什么时候被全部消完。
dp[x]=max(dp[lson],dp[rson],min(dp[lson],dp[rson)+1)
三个元素分别代表了lson,rson,x自己被消掉的次数。
注意特判最左/右链上的点的dp值,
最左链上的点只有右儿子被消掉才会被消掉。(左边没有比他大的数字)
最右链上的点只有左儿子被消掉才会被消掉。(右边没有比他大的数字)
然后考虑转dp套dp
dp[x][k][0/1/2]表示x个点构成的笛卡尔树,满足被k次消掉,根节点是否在左右链上的方案数。
转移的时候枚举最大值的位置,然后划分为两个子树,两个儿子的k值满足那个dp方程即可。
代码正在写qwq

猜你喜欢

转载自www.cnblogs.com/Creed-qwq/p/10316420.html