意外失去双手

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


《CF1608F MEX counting》

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

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

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

因此易得转移式。共三类转移:mex 增大、新未定值、旧未定值。

f1(v+j+1,ij)f(v,i) for all j0

f2(v,i+1)(i+1)f(v,i)

f3(v,i)if(v,i)

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


《USACO 2020.2 Platinum Help Yourself》

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

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

Δf=exp(x)l=1r1f(l1)g(l,r)

g(l,r)=2c(l,r)m=lr1g(l,m)2c(m+1,r)

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

Δf=l=1r1f(l1)[2c(l,r)m=lr1g(l,m)2c(m+1,r)]

看上去就明显复杂些的是

χ=l=1r1f(l1)m=lr1g(l,m)2c(m+1,r)

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

λm:=l=1mf(l1)g(l,m)

χ=m=1r1λm2c(m+1,r)

r 移动时,只是 λm 的系数发生变化:对 ml0 执行 cc+1 罢了。

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

复杂度 O(nklogn+nk2)


《AGC039F Min Product Sum》

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

ri,ci 分别为行和列的 min,它说的权值是 i=1nj=1mmin{ri,cj},希望你们不会搞错。

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

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

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

a 侧为例。一行上填数的方案是 λ=(kv+1)mb(kv)mb,有转移

fv(aj,b)(aj)(λvb)jfv+1(a,b)

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

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


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

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

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

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

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


卡常专训之 某道考试题》:给 n 个点的带边权有向图,q 次求 st 且走过的边数为 a 的第 k 小的边权和。n,q166k15a106

暴力矩乘是 O(n3klogk) 的。但是,没错,出题人就要卡那个 logk

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

同样的方法也用到向量乘矩阵上,复杂度就是 O(n3kloga+n2qloga),少个 logk 罢了。但出题人就是要卡常,你拿他没办法 😒


《NOI2016 网格》

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

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

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

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

posted @   OneInDark  阅读(217)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示