NOIP 模拟 3

T1 网格(grid)

小清新 DP 题。
答案形如一个多项式,考虑依次处理每一项,已经处理好的不会有任何影响,只需要时刻考虑当前项。\(f_{i,j}\) 表示已经处理好的项的和,\(mul_{i,j}\) 表示当前项要做贡献的次数和(系数),\(d_{i,j}\) 表示如果当前项当前位置的值的和。转移如下,附手玩表格
在是数字的时候

\[\begin{aligned} &f_{i,j}=f_{i-1,j}+f_{i,j-1}\\ &mul_{i,j}=mul_{i-1,j}+mul_{i,j-1}\\ &g_{i,j}=g_{i-1,j}\times 10+mul_{i-1,j}\times a_{i,j}+g_{i,j-1}\times 10+mul_{i,j-1}\times a_{i,j} \end{aligned} \]

在是符号的时候

\[\begin{aligned} &g_{i,j}=0\\ &f_{i,j}= \begin{cases} &f_{i-1,j}+f_{i,j-1}&s_{i,j}=\times\\ &f_{i-1,j}+f_{i,j-1}+g_{i-1,j}+g_{i,j-1}&s_{i,j}=+ \end{cases}\\ &mul_{i,j}= \begin{cases} &g_{i-1,j}+g_{i,j-1}&s_{i,j}=\times\\ &i+j-2\choose i-1&s_{i,j}=+ \end{cases} \end{aligned} \]

直接递推转移即可。

T2 矩形(rect)

优秀暴力就是依次考虑每一 行/列,查看共有的 \(1\) 的个数 \(cnt\),问题实质上就是给定若干个集合,求 \(\sum{|S_i\cap S_j|\choose 2}\)
这种暴力有两种形式实现,一种基于行,一种基于列,设 \(B\) 表示行内点的平均个数(相信你此时已经看出来要根号分治了)

  • 基于行,直接暴力去前面每一行找,时间复杂度 \(\mathcal{O}(\frac{n}{B}n)=\mathcal{O}(\frac{n^2}{B})\)
  • 基于列,考虑对于这一列内所有的点,给包含它的列编号的列的权值加 \(1\),然后直接去和那些列匹配算贡献即可,时间复杂度 \(\mathcal{O}((\frac{n}{B})B^2)=\mathcal{O}(nB)\)

这两种方法本质就是把行和列换了一下,\(B\)\(\sqrt n\) 时最优,根据这个把 \(S\) 分为大小两类,根据上面两种方法可以统计出 大-大,小-小 两种匹配,还剩一个 小-大,直接用列的方法统计即可,不重不漏。

T3 集合(set)

困难计数,改不了一点。

T4 水瓶(bottle)

神仙期望 DP,有空改。

总结

DX 场,全是好题,一点不会,赛时 T1 没冲出来,后面也不会暴力,垫底了。

posted @ 2024-11-01 16:45  Ishar-zdl  阅读(87)  评论(17)    收藏  举报