LGP8329口胡

群里某人说 ZJOID1T1 是萌萌数数题。

本着whk去死的原则,我在物理课上口胡了这道题,结果出场的时候都还只会 \(O(n^4)\)

结果吃饭的时候把 \(O(n^3)\) 胡出来了

考虑一件事情。把节点分为黑白两类,黑色的在第一棵树中是叶子结点,白色的在第二棵树中是叶子结点。其中 \(1\) 必定是白色,\(n\) 必定是黑色。

把白色节点和黑色节点按照编号排序后丢到两个序列 \(q\)\(p\) 中,下面为了方便设 \(n=|q|,m=|p|,n+m+N\)

我们对于每一种 \(N\) 枚举 \(n,m\)

注意到 \(q[i]\) 在第一棵树中的父亲一定是 \(q[1\sim i-1]\)\(p[i]\) 在第二棵树中的父亲一定是 \(p[i+1\sim m]\),于是只需要考虑叶子结点的父亲即可。

这一部分的权值相当于是 \((n-1)!(m-1)!\)

抽象下来相当于是,一个黑白序列的权值定义为每个位置的权值之积,白色位置的权值为后面黑色位置的数量,黑色位置的权值为前面白色位置的数量。

然后询问固定黑白数量时所有序列的权值之和。

能想出来一个很简单的 DP:\(dp[w][b][x][y]\) 表示一共有 \(w,b\) 个白/黑色节点,前面已经有了 \(x,y\) 个。

然而这个状态数量太多了,肯定是没救的。

那么压状态数。\(dp[w][b][y]\) 表示目前有 \(w,b\) 个白/黑色节点,整个序列一共有 \(y\) 个黑色。

每次转移的时候枚举类似 白白白白...黑 的一段即可。

虽然状态数有救了,但是转移是个问题。因为每个状态需要转移 \(O(n)\) 次。

方程是 \(dp[w][k][b]=w\times\sum_{i=1}^{w-1}dp[i][k-1][b]\times(b-k+1)^{w-i}\),可以使用前缀和优化。

然后设 \(f[n][m]\) 表示 \([1,n]\) 中选 \(m\) 个可以相同的数乘起来,所有可能的积之和。

那么答案是 \(ans_n=\sum_{w+b=n}\sum_{i=1}^{w}\sum_{j=1}^{b}(-1)^{w-i}(-1)^{b-j}f[i][w-i]\times f[j][b-j]\times dp[i][j][j]\times(i-1)!\times(j-1)!\)

后面的容斥对两个维度分别容斥就好了。。。复杂度 \(O(n^3)\)

posted @ 2022-05-09 13:07  Prean  阅读(21)  评论(0编辑  收藏  举报
var canShowAdsense=function(){return !!0};