AGC041F Histogram Rooks
题意:有一个
该棋盘上放置“車”棋子,若一个格子和某个“車”同行或同列,且之间都是棋盘,则称该格子被覆盖。
求将该棋盘完全覆盖的放置方案数。
答案对
AT 题目总是让人一看就很想知道答案,但是想半分钟就会发现根本不可做。
市面上的题解都比较意识流,看了半天才看懂,这里整理一个详细一点的……
考虑容斥,选(钦定)
此时对于某个还能放置車的格子,方案数就是
这个做法虽然很直观易懂,但是还没有利用题目的任何性质。考虑对“不可放置”这一条件进行化简。
不难发现,由于行总是连续的,若某一行选了一个格子,则这一整行都不能放置車。
枚举不能放置車的行集合
所以,对于每个独立的部分,即列上的一个极长连续段,计算出贡献,然后乘起来即可。
若列连续段长度为
① 没有格子被选,则所有不在
中的格子都能放置,方案数为 。 ② 枚举选格子的个数,贡献为
。
但这个做法是错误的,因为不能保证
那就……再容斥!
钦定不能选格子的行集合
若列连续段中有
现在正确性有保证了,然而枚举
不难发现,一个列连续段最终的贡献只与
前面的做法指出了映射 “
坏消息是,在统计
具体地,影响的方式如下:
观察棋盘的形状,将其剖分成笛卡尔树的形式,如图:(图是蒯 @Itst 神的)
我们只关心
在某个确定的
红色部分的某一列在
红色部分的某一列的
这启发我们在笛卡尔树上做树形
设
转移时,
对于右侧没东西的行,可以看作特殊的儿子。
复杂度为树上背包的复杂度,即
求出 pow
一下列数,就能得到自己的贡献。
若每次都 pow
,复杂度可以达到