Solution - P5664 [CSP-S2019] Emiya 家今天的饭

P5664 [CSP-S2019] Emiya 家今天的饭

idea:

容斥,将原问题转化为总方案减去不合法的方案。用乘法原理快速计算总方案,再寻找到一个漂亮的性质,利用 dpdp 计算出不合法方案。 dpdp 进行一步优化,减去无用状态

简化题意:

有一个 nnmm 列的矩阵,坐标为 (i,j)(i,j) 的格子上有 ai,ja_{i,j} 个不同的数。

现在取 kk 个数满足以下条件:

  1. k>0k>0

  2. 每行只取一个数。

  3. 每列最多取 k2\lfloor\frac{k}{2}\rfloor 个数。

求方案数。

分析:

第三个条件不好下手,先不考虑。

我们不妨设 si=j=1mai,js_i = \sum_{j=1}^m a_{i,j}

那么满足前两个条件的方案数显然是

i=1n(si+1)  1\prod_{i=1}^n (s_i+1)\ \ - 1

可以 O(nm)O(n\cdot m) 处理出 sis_i ,再 O(n)O(n) 求出。

接下来考虑第三个条件。

关键的思想:最多只有一列是不合法的 (即有 2(k2+1)>k2\cdot (\lfloor\frac{k}{2}\rfloor + 1) > k )。

我们考虑枚举不合法的列。设当前枚举到了第 ii 行,不合法的列为 kk ,不合法的列选了 jj 个数,其他列选了 hh 个数。

fk,i,j,hf_{k,i,j,h} 表示第 kk 列不合法,前 ii 行,不合法的列选了 jj 个数,其他列选了 hh 个数的方案数。有以下选择:

  1. 在别的列取数:

fk,i1,j,h1(siai,h)f_{k,i-1,j,h-1}\cdot (s_i - a_{i,h})

  1. 在不合法列取数:

fk,i1,j1,hai,hf_{k,i-1,j-1,h}\cdot a_{i,h}

  1. 当前行不取数:

fk,i1,j,hf_{k,i-1,j,h}

故有转移:

fk,i,j,h=fk,i1,j,h1(siai,k)+fk,i1,j1,hai,k+fk,i1,j,hf_{k,i,j,h} = f_{k,i-1,j,h-1}\cdot (s_i - a_{i,k}) + f_{k,i-1,j-1,h}\cdot a_{i,k} + f_{k,i-1,j,h}

不合法的方案数为:

k=1mj=1nh=1j1fn,j,h\sum_{k=1}^m\sum_{j=1}^n \sum_{h=1}^{j-1} f_{n,j,h}

时间复杂度 O(mn3)O(m\cdot n^3) ,可以拿高分。

然而我们发现,具体的 j,hj,h 对我们来说用处不大,我们只关心 jhj-h 的值。

故可以将状态化为: fk,i,jf_{k,i,j} 表示第 kk 列不合法,前 ii 行,不合法的列比其他列多选了 jj 个数的方案数。

显然 j[n,n]j\in [-n,n] 。有转移:

fk,i,j=fk,i1,j+1(siai,k)+fk,i1,j1ai,k+fk,i1,jf_{k,i,j} = f_{k,i-1,j+1}\cdot (s_i - a_{i,k}) + f_{k,i-1,j-1}\cdot a_{i,k} + f_{k,i-1,j}

时间复杂度 O(mn2)O(m\cdot n^2) ,可以通过。