官方题解

cookiebus 2024-04-11 16:32:42 1 返回题目

20pts:

暴力枚举所有情况即可。

50pts:

对于所有的情况,考虑,本质上这个过程就是问你有多少种不同的二叉树,并且对于1号节点到根的路径,每个点都是子树内的最大值,且这个值得是被收买的人之一。

那么表示已经考虑过前小的被收买的人,当前这个状态中是1的位置已经被某个收买的人占有的方案数。

那么直接枚举这个人是否占了某个位置,然后用组合数转移即可(具体可看)。

注意到最后还得给答案乘上,因为这个子树之间的顺序并没有确定。

100pts:

考虑到还得在这个过程中维护LIS,那么首先考虑LIS的一种维护方法:

我们可以从小到大依次来算每个数字的LIS,这个数字的LIS,等于在他位置之前所有数字LIS的最大值

例如4个数字{3 1 2 4}

我们用如下顺序算出LIS:

{0 1 0 0}

{0 1 2 0}

{1 1 2 0}

{1 1 2 3}

那么我们可以暴力出所有LIS过程中可能的序列,发现这个数量其实并不太大,当的时候也才不到,那么就用这个当之前那个状压的状态,去跑dp即可。

时间复杂度

实际上有一个更强的结论,当比较接近的时候,有用状态特别少,那么实际上可以在搜索的时候只保留那些可能让LIS大于等于的状态,于是可以把出的很接近,然后放大

{{ vote && vote.total.up }}