AGC 026 D
一个很神仙的 dp,这题完全可以出到 n≤105 啊不知道为啥只有 100。。
考虑,第一行是黑白相间的,那么后面都必须黑白相间,有反色和复读两种情况。而如果第一行不是黑白相间的,那么下一行的构造就只能反色,所以一个第一行不是黑白相间的情况对应唯一一种方案。
然后我们可以按照套路类似笛卡尔树上的 dp,设 dp[u][0/1] 表示当前在笛卡尔树的 u 节点,这个节点所包含的区间是 黑白相间 / 任意排列 ,然后考虑怎么转移,设当前在节点 u ,它下一层一共有 v1,v2,…vk 个节点,一共有 w 个这一层的最小值,这一层到上一层的距离为 x 那么有:
dp[u][0]=2x∏i=1..kdp[vi][0]dp[u][1]=2w∏i=1..k(dp[vi][0]+dp[vi][1])+(2x−2)∏i=1..kdp[vi][0]因为考虑,如果这一层是黑白交错,那么下一层也必须黑白交错,而黑白交错每一层可以反色或者复读,所以系数是 2x 。
如果这层任意填,我们考虑如果这 x 层全程在复读,那么这一层到下一层有两种情况:
- 这一层和在 v 区间的下一层一摸一样,也就是说这里下一层的方案数量是 dp[v][1] ,这种情况系数是 2w,因为空的格子可以任意安排。
- 这一层和咋 v 区间的下一层相反了,也就是说这里下一层的方案数量是 dp[v][0] ,这种情况系数也是 2w,因为空的格子可以任意安排。
这两种情况加起来才是 v 对 u 的贡献,应根据乘法原理乘起来。
考虑如果这里的 x 层并非一直复读,而是黑白交错的跑,也就是前面的第一个方程那样(因为我们算的是总方案数量),那么本来应该就是第一个方程的值,但是其中有两种情况,也就是 黑白黑白黑白… 和 白黑白黑… 也是可以全程复读的,这两种情况应该减去,于是就是最后的答案辣!
cpp
1 |
|