AT_agc041_f [AGC041F] Histogram Rooks

题目大意:

有一个底部齐平,高度为 \(h_{i}\)\(n\) 列的棋盘,请问有多少种放置車的方式,使得每个位置都会被車攻击到(不要求車互不攻击)。
\(n \le 400, h_{i} \le 400\)

解题思路:

考虑一个 \(n \times m\) 的棋盘怎么去算。
“每个位置都” 往往是不好做的,考虑容斥,钦定 \(S\) 集合内的点不能被車攻击。
由于每个車都能掌管一行和一列,所以这集合内的点所在行的集合和列的集合内不能有車。
那么考虑枚举列数和行数表示钦定这些行列里不能有车,但由于得保证这些行列中每行每列至少都有一个位置被钦定,所以是不好做的。

换个容斥方法,设 \(S\) 表示 \(S\) 内的列里都有被钦定不被攻击的点。
但是,我们让容斥系数与多少个不能被車攻击的位置的个数有关

我们知道 \(S\) 之后,可以考虑每一行有没有钦定不能被攻击的情况。

  1. 这一行没有不可被攻击的点,那么设这一行的范围是 \(l_{i} \sim r_{i}\),那么方案数就是非 \(S\) 内的随便放車 \(2^{|[l_{i} \sim r_{i}] - S|}\)
  2. 这一行有不可被攻击的点,那么只能在 \(S\) 内,由于每有一个不能被攻击的点就会有 \(-1\) 的贡献,所以设有 \(p\) 个位置不被攻击,那么贡献是 \(\sum_{p=1} C_{|[l_{i} \sim r_{i}] - S|}^{i} \times (-1)^p\)

后面的式子可以通过二项式定理来优化,那么 \(\sum_{p=1} C_{|[l_{i} \sim r_{i}] - S|}^{i} \times (-1)^p = \sum_{p=0} C_{|S|}^{i} \times (-1)^p - 1 = (1 + (-1))^{|S|} - 1 = -[|S| > 0]\)

但这里有个问题,就是并不能确定是否每列都有不可被攻击的位置。

那么我们继续容斥,钦定 \(T\) 表示 \(S\) 中至少 \(T\) 列中没有不可被攻击的点,容斥系数为 \((-1)^{|T|}\)
而且我们对 \(S\) 的定义改为只有 \(S\) 内的列可能有不被攻击的点。

那么转移还是类似上面的,只不过将 \(-[|S| > 0]\) 变成了 \(-[|S-T| > 0]\)
观察我们的方案,发现只和 \(|[l_{i} \sim r_{i}] - S|\)\([|S-T|]>0\) 有关。

所以我们设 \(dp_{i,j,k}\) 表示考虑了前 \(i\) 行,\(|[l_{i} \sim r_{i}] - S| = j\)\([|S-T|]>0\) 是否成立的贡献。
贡献里包含 \((-1)^T\),这个套路在 \(NOIP2024 T3\) 中也用过。

那么时间复杂度为 \(O(n^2)\)

考虑原问题,发现同一行的两个数可能不互相影响,而且同一行的两个数互不影响当且仅当他们中间没有比他们小的上限。
所以想到了小根堆笛卡尔树,将 \(dp_{i,j,k}\) 改为 \(i\) 子树内 \(|[l_{i} \sim r_{i}] - S| = j\)\([|S-T|]>0\) 是否成立的贡献。
由于笛卡尔树的优秀的性质:保证了子树是原序列的一段区间。
于是父亲的 \(l_{i} \sim r_{i}\) 一定包含儿子的 \(l \sim r\)

所以可以直接继承。
\(O(n^2)\)

posted @ 2025-08-22 11:24  positive_deviation  阅读(9)  评论(0)    收藏  举报