CF295D Greg and Caves

发布于 2021-06-28  3.61k 次阅读


题面

题意

问满足下列条件的 n×m 的 01 矩阵 a 的数量:

  1. [l, r](1lrn),满足 i[l, r], jai,j=2i[l, r], jai,j=0
  2. [l, r] 中的每一行的第一个值为 1 的位置的下标为 xi,第二个值为 1 的位置的下标为 yi,则:t[l, r],满足 i[l, t1], xixi+1, yiyi+1i[t, r1], xixi+1, yiyi+1

分析

考虑使用 DP 解决本题。

f[i][j] 表示考虑洞的前 i 行(该 i 行都在洞的中间位置 t 的上方)且第 i 行的 yixi+1=j 时该洞的构造方案(不考虑洞在矩阵中的摆放位置)。

考虑枚举第 i1 行的长度以及与第 i 行的相对位置,得出转移方程:

f[i][j]=t=0jf[i1][t]×(jt+1)

尝试使用该数据描述最终答案 Ans,考虑枚举中间位置 t 的行编号以及该行 yixi+1 的大小。同时由于可能存在构造洞的方案满足第 t 行与相邻的几行的形态完全相同,为了防止算重,考虑令 t 为洞的最大的满足 yixi+1 最大的行数,同时枚举 t+1 行的长度(小于 t 行长度),算出最终答案:

Ans=i=1na=0m2(ma1)×(l=1if[il+1][a])×(1+b=0a1(r=i+1nf[ri][b])×(ab+1))=i=1na=0m2(ma1)×(t=1if[t][a])×(1+b=0a1(t=1nif[t][b])×(ab+1))

g[i][j]=k=1if[k][j]

Ans=i=1na=0m2(ma1)×g[i][a]×(1+b=0a1g[ni][b]×(ab+1))

h[i][j]=k=0j1g[i][k]×(jk+1)

Ans=i=1na=0m2(ma1)×g[i][a]×(1+h[ni][a])

处理 f[i][j] 前缀和优化到 O(nm),处理 g[i][j] O(nm),处理 h[i][j] 前缀和优化到 O(nm),计算答案 Ans O(nm)

总时间复杂度 O(nm)

代码

View on Github


我缓慢吐出一串啊吧啊吧并不再想说话