题解:P12558 [UOI 2024] Heroes and Monsters

题面:

(这个没交洛谷,给学弟写的。)

\(O(n^3)\)

考虑直接求出所有 \(ans_i\),前缀和回答询问。
\(a,b\) 先排序。由于我们只关心英雄的集合,所以怪兽我们贪心选择,如果我们选这个英雄那么选最前面的怪兽,否则选后面第一个能打死自己的怪兽。显然,合法方案怪兽的前缀会被英雄打死,后缀会打死英雄,显然了就不证。
\(f_{i,j}\):前 i 个英雄匹配了 j 个怪兽的方案数。
这时我们发现我们选后面第一个能打死自己的怪兽可能会碍后面想打怪兽的英雄的事,所以枚举断点 \(k\)
我们让钦定去悲伤的英雄去选择 \([k+1,n]\) 的怪兽,高兴的英雄去选 \([1,k]\) 的怪兽。

\(f_{i,j}=f_{i-1,j-1}[b_j<a_i]+f_{i-1,j}[b_{k+1+(i-1-j)}>a_i]\)

\(O(n^2)\)

我们找到 \(a_p<b_k<a_{p+1}\) 这样的 \(p\)
那么 \([1,p]\) 的英雄肯定能找到比自己大的怪兽,\([p+1,n]\) 的英雄肯定能找到比自己小的怪兽,显然内部不冲突。
那么我们只需要考虑前缀是否能找到比自己小的怪兽,后缀能否找到比自己大的怪兽。

\(f_{i,j}\)\([1,i]\) 的英雄 \(j\) 个找到了比自己小的怪兽的方案数。
\(g_{i,j}\)\([i,n]\) 的英雄 \(j\) 个找到了比自己大的怪兽的方案数。

下面是转移(\(g\) 我们倒着更新,那么肯定是取后缀怪兽):

\(f_{i,j}=f_{i-1,j-1}[b_j<a_i]+f_{i-1,j}\)
\(g_{i,j}=g_{i+1,j-1}[b_{n-(j-1)}>a_i]+g_{i+1,j}\)

那么我们枚举一个数 \(c\),表示 \([1,p]\)\(c\) 个高兴的英雄,那么 \([p+1,n]\)\((k-c)\) 个高兴的英雄。
直接合并就好了。

\(ans_m=\sum_{c=0}^m f_{p,c}×g_{p+1,n-p-(k-c)}\)

posted @ 2025-09-19 08:23  _a1a2a3a4a5  阅读(9)  评论(0)    收藏  举报