Loading

2026省选集训题解

P8428 [COI 2020] Pastiri

一类非常经典的树上贪心思路。考虑这样一个贪心:每次找到没有被管辖的深度最大的一头羊,然后在其祖先中找到深度最浅的并且能够管辖这头羊的点,在这个点上放置一个牧羊人。我们声称这样是最优的,设这头羊为 \(X\),这个祖先是 \(P\),那么对于任意一个 \(P\) 的子树中一个 \(X\) 的兄弟子树中的点 \(Q\),即一个与 \(X\) 不在同一子树内的 \(P\) 子孙 \(Q\)\(Q\) 能够管辖的点一定被 \(P\) 包含,反证法:

不是 \(P\) 的点能够管辖的点都被 \(P\) 包含,那么 \(P\) 自然就是最优的。

因此我们可以得到一个看似 \(O(n^2)\) 的暴力,即将所有羊按照 \(dep\) 从深到浅排序处理,如果这个羊已经被管辖就跳过,否则暴力找其最浅的祖先 \(P\) 使其能够管辖这头羊,然后再标记 \(P\) 能够管辖的所有羊即可,对于判断是否可以管辖,我们可以对每个点求出离它最近的羊的距离 \(d_u\),这个可以直接多源bfs求出,然后可以直接判断 \(d_P=dep_u-dep_P\)。分析一下,由于跳上去之后可以将这一整条链都标记,所以找 \(P\) 均摊下来其实是 \(O(n)\) 的,而覆盖所有能够管辖的点本质就是一个标记点的 \(\mathrm{dfs}\),那均摊也是 \(O(n)\) 的。

因此这样时间复杂度就是 \(O(k\log k+n)\),可以通过。

P12558 [UOI 2024] Heroes and Monsters

赛时已经想到 \(O(n^3)\) 做法了,但是没有想到前后分开dp最后拼接的思想。

最优显然是对位匹配,令选择的集合为 \(S\),则:

  • \(S\) 的第 \(i\) 小要与 \(b_i\) 匹配。

  • 不在 \(S\) 中的第 \(i\) 小要与 \(b_{|S|+i}\) 匹配。

于是可以设计出很傻的 \(O(n^3)\) \(\mathrm{dp}\),但是由于我们要对位匹配,必须要枚举 \(m=|S|\) 来确定配对关系,令 \(dp_{i,j}\) 表示前 \(i\) 位中选择 \(j\) 个数的方案数,则

\[dp_{i,j}=dp_{i-1,j-1}\cdot[a_i>b_j]+dp_{i-1,j}\cdot [a_i<b_{m+i-j}] \]

这样是没有前途的。观察一下这个 \(\mathrm{dp}\),每次都受 \(m\) 的影响很唐,考虑能不能暂时去掉 \(m\) 的限制。先考虑对限制变形:

  1. \(S\) 的第 \(i\) 小要与 \(b_i\) 匹配。

  2. 不在 \(S\) 中的\(i\) 大要与 \(b_{n-i+1}\) 匹配

可以发现,此时限制与 \(m\) 无关了,我们容易想到对这两个限制分别跑一个前缀和后缀的 \(\mathrm{dp}\),分别只满足1,2的条件。这个是easy的,用 \(f_{i,j},g_{i,j}\) 分别表示前缀后缀,分别只受第1/2个条件限制,选择 \(j\) 个数的方案数,则:

对于前缀:

\[f_{i,j}=f_{i-1,j}+f_{i-1,j-1}\cdot [a_i>b_j] \]

对于后缀:

\[g_{i,j}=g_{i+1,j-1}+g_{i+1,j}\cdot [a_i<b_{i+j}] \]

如果我们随便将序列分成 \([1,x]\)\([x+1,n]\) 两部分拼起来,使得 \([1,x]\) 只满足1,\([x+1,n]\) 只满足2,但是 \([1,x]\) 中没选的数可能不满足2,\([x+1,n]\) 选的数可能不满足1,因此不能随便拼起来,因此我们需要找到一个特殊的分界点 \(x\),使得 \([1,x]\) 中没选的数天然满足2,\([x+1,n]\) 选的数天然满足1

我们声称,找到 \(x\) 使得 \(a_x<b_m<a_{x+1}\),则这个 \(x\) 就是一个合法的分界点,因为此时左边没有选的第 \(i\) 大数在右边对应 \(b_{m+x}>b_m>\max\limits_{i\le x}a_i\),因此一定合法,右边同理。那这个 \(x\) 可以直接双指针找到,就是最大的 \(a_x<b_m\),那么就可以直接拼起来了,枚举左边选了 \(k\) 个,那么贡献就是 \(\sum\limits f_{x,k}\cdot g_{x+1,m-k}\)

因此时间复杂度 \(O(n^2)\)

posted @ 2026-02-25 16:07  STDJCY  阅读(1)  评论(0)    收藏  举报