意外失去双手

打代码的愿望已经消失殆尽了。这是个问题,但我还没想好怎么解决。


《CF1608F MEX counting》

记录有多少个位置的值未确定。转移系数是组合数与第二类斯特林数,难搞。

考虑 系数提前计算(真的有这种名字的东西吗)。

  • 去掉斯特林数:提前给这些未确定的值做值的归类,即记录不同的值的种类数。
  • 去掉组合数:提前定序,这样只能依次取用。

因此易得转移式。共三类转移:\(\text{mex}\) 增大、新未定值、旧未定值。

\[f_1(v{+}j{+}1,\;i{-}j)\gets f(v,i)\text{ for all }j\geqslant 0 \]

\[f_2(v,\;i{+}1)\gets (i{+}1)f(v,i) \]

\[f_3(v,i)\gets i\cdot f(v,i) \]

最后 \(f(v,i)\) 对答案的贡献是,将 \(i\) 个无标号球放入 \((n{-}v)\) 个有标号盒子,可以空盒的方案数。经典隔板法,式子我不列了。复杂度 \(\mathcal O(n^2 k)\)


《USACO 2020.2 Platinum Help Yourself》

这是 \(\sf Quack\) 分配给我的。手气不错,选了个水题。

\(f(r)\)\([1,r]\) 的连通块个数的集合 \(\rm EGF\),令 \(g(l,r)\)\([l,r]\)\([l,r]\) 内的线段 \(\rm induce\) 的方案数。

\[\Delta f=\exp(x)\sum_{l=1}^{r-1}f(l{-}1)g(l,r) \]

\[g(l,r)=2^{c(l,r)}-\sum_{m=l}^{r-1}g(l,m)2^{c(m+1,r)} \]

其中 \(g(l,l)=1,\;f(0)=\exp(0x)=1\)

\[\Delta f=\sum_{l=1}^{r-1}f(l{-}1)\left[2^{c(l,r)}-\sum_{m=l}^{r-1}g(l,m)2^{c(m+1,r)}\right] \]

看上去就明显复杂些的是

\[\chi=\sum_{l=1}^{r-1}f(l{-}1)\sum_{m=l}^{r-1}g(l,m)2^{c(m+1,r)} \]

只有 \(2^{c(m+1,r)}\) 在随着 \(r\) 改变,以及 \(m\) 的上指标发生变化。但后者可以认为是 \(c(l,r)=-\infty\;(l>r)\) 导致的,这启发我们定义

\[\lambda_m:=\sum_{l=1}^{m}f(l{-}1)g(l,m) \]

\[\chi=\sum_{m=1}^{r-1}\lambda_m2^{c(m+1,r)} \]

\(r\) 移动时,只是 \(\lambda_m\) 的系数发生变化:对 \(m\leqslant l_0\) 执行 \(c\gets c+1\) 罢了。

因此 \(\chi\) 可维护。再把 \(f(l)\) 加到 \(\lambda_l\) 里面去,就顺便统计了另一项。

复杂度 \(\mathcal O(nk\log n+nk^2)\)


《AGC039F Min Product Sum》

这题面我不知道理解错了多少次

\(r_i,c_i\) 分别为行和列的 \(\min\),它说的权值是 \(\prod_{i=1}^{n}\prod_{j=1}^{m}\min\{r_i,c_j\}\),希望你们不会搞错。

考虑每个 \(r_i\)\(c_i\) 的贡献,那就是不同名变量中大于它的数的数量。等于的随便放在一边。

按照行或列填矩阵是困难的,且上面这玩意儿明显按照值有序,因此按值 \(\tt dp\) 。记 \(f_v(a,b)\) 为,填了 \([v,k]\) 中数字,剩余 \(a\)\(b\) 列是空的。

考虑转移。新加入的 \(v\) 应当在 \(a,b\) 管辖范围内,二者可以分别转移。——或者你可以这么想,我们就是单纯地对 \(\{r_i\},\{c_j\}\) 在归并,顺便填了个矩阵出来,因此可以(也必须)分别转移。

\(a\) 侧为例。一行上填数的方案是 \(\lambda=(k-v+1)^{m-b}-(k-v)^{m-b}\),有转移

\[f_{v}(a{-}j,\;b)\gets{a\choose j}(\lambda v^b)^j\cdot f_{v+1}(a,b) \]

\(b\) 这一维上的转移是类似的。转移是 \(\mathcal O(n{+}m)\) 的,状态 \(\mathcal O(knm)\) 个,总复杂度 \(\mathcal O[knm(n{+}m)]\)

另:狗狗用了些奇特的转化、奇特的状态定义,也得到了个做法,尚不清楚与该做法的联系。


《某道考试题》:长为 \(n\) 的序列 \(a\)\(m\) 轮冒泡排序,每次大小比较有 \(p\) 的概率返回错误结果,求最后每个位置上的数的期望大小。\(n\leqslant 15\land m\leqslant 500\)

我在想,究竟是我太愚蠢,还是我思考时不打草稿的习惯导致了我的砂皮行为。

看数据范围,感觉是 \({\cal O}(\text{poly}(n)m2^n)\),也就是说状态用 \(0/1\) 来记录。那 \(\text{0-1 principle}\) 吗?好像 \(1,1\) 内部的 \(\tt swap\) 的概率受到二者的相对大小关系影响?

放屁吧,那是概率诶,概率的和是 \(1\),所有情况下 \(\text{0-1}\) 序列都不变,所以没影响。我到底怎么就瞬间把自己否定了,然后再也不考虑这种做法的?

注意 \(1\) 的数量是不变的,因此 \(\text{0-1 principle}\) 共有 \(\mathcal O(2^n)\) 状态。转移 \(\mathcal O(nm)\) 步,复杂度 \(\mathcal O(nm2^n)\)


卡常专训之 某道考试题》:给 \(n\) 个点的带边权有向图,\(q\) 次求 \(s\to t\) 且走过的边数为 \(a\) 的第 \(k\) 小的边权和。\(n,q\leqslant 166\land k\leqslant 15\land a\leqslant 10^6\)

暴力矩乘是 \(\mathcal O(n^3k\log k)\) 的。但是,没错,出题人就要卡那个 \(\log k\)

在矩乘时,考虑用分层的最值维护:最外层建大小为 \(\mathcal O(n)\) 的堆维护中间点 \(x\) 的最优。在 \(x\) 变化后,可以暴力(或者用堆,不是瓶颈)查 \(x\) 的新最优值。这样单个位置是 \(\mathcal O(nk+k\log n)\) 求出的。

同样的方法也用到向量乘矩阵上,复杂度就是 \(\mathcal O(n^3k\log a+n^2q\log a)\),少个 \(\log k\) 罢了。但出题人就是要卡常,你拿他没办法 😒


《NOI2016 网格》

答案不超过 \(2\) 。金角银边草肚皮。因此只需要做一些小思考。

判连通性。可以考虑将每一行的连续跳蚤直接变成连通块,多行没有蛐蛐的行变为连通块,这样只有 \(\mathcal O(c)\) 个点和边,直接判断就行。

放一个蛐蛐?只可能放在已有蛐蛐的八连通格内。把这些点视作关键点,还用上面的方法划分连通块(不含关键点必然连通嘛),判断有无割点即可。

看题解区,好像特殊情况比较多,没写过,不知道细节处理完不完善

posted @ 2022-07-23 17:12  OneInDark  阅读(207)  评论(0编辑  收藏  举报