Files
luogu/solutions/P3205.md
T
hanyixuanten d8022d46bb
Check cpp / md pair / Check md headers (push) Successful in 4s
Sync solutions to Wiki / sync (push) Successful in 5s
new file: solutions/P3205.md
2026-10-27 10:31:19 +00:00

701 B

P3205 [HNOI2010] 合唱队 题解

题意插入 n 个数,对于每个数,若大于上一个则放右边,否则放左边。求有多少种插入序列,使得最后排列与给定序列相同。

考虑区间 dp,设 f_{i, j} 表示区间 [l, r] 且最后一次插入从左边的方案数,g_{i, j} 表示区间 [l, r] 且最后一次插入从右边的方案数。则:


\begin{aligned}
f_{i, j} =& f_{l + 1, r} * (a_l < a_{l + 1}) + g_{l + 1, r} * (a_l < a_r) \\
g_{i, j} =& f_{l, r - 1} * (a_l < a_r) + g_{l, r - 1} * (a_{r - 1} < a_r)
\end{aligned}

转移即可。注意 f_{i, i}, g_{i, i} 只有一个能够设为 $1$,否则会重复计算。

code