From 4365fa9fd926f26ea77233a260f9ff5c1838085c Mon Sep 17 00:00:00 2001 From: "gitea-actions[bot]" Date: Tue, 27 Oct 2026 10:31:45 +0000 Subject: [PATCH] Sync solutions from hanyixuanten/luogu@d8022d4 --- P3205.md | 16 ++++++++++++++++ _Sidebar.md | 1 + 2 files changed, 17 insertions(+) create mode 100644 P3205.md diff --git a/P3205.md b/P3205.md new file mode 100644 index 0000000..9885318 --- /dev/null +++ b/P3205.md @@ -0,0 +1,16 @@ +# 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](../P3205.cpp) diff --git a/_Sidebar.md b/_Sidebar.md index 8086c69..5d6786c 100644 --- a/_Sidebar.md +++ b/_Sidebar.md @@ -16,5 +16,6 @@ - [[P2016|P2016]] - [[P2607|P2607]] - [[P3199|P3199]] +- [[P3205|P3205]] - [[P3572|P3572]] - [[P6650|P6650]]