UOJ Logo wangrx的博客

博客

#965 solution

2022-03-21 12:38:28 By wangrx

原题等价于,反转 01 串的一段后缀,使得 01 串的 popcnt 最小。

证明:因为没有子串 10,最后一定是 00000...11111 。

于是把原串分为左右两段:

  • 左边一段删去所有的 1,操作次数即 popcnt。
  • 右边一段删去所有的 0,操作次数即反串的 popcnt。

注意到反转后缀对 popcnt 的增减量是后缀和(0 为 1,1 为 -1),

考虑增量构造,设 $r$ 为当前情况下原串的 popcnt,$m$ 为当前情况下的答案。

  • 若往后添加一个 $1$(概率 $1-p_n$),$m$ 不变,$r++$。
  • 若往后添加一个 $0$(概率 $p_n$),
    • 如果 $r=m,r,m$ 均不变。(不反转是最优的)
    • 否则 $r$ 不变,$m++$。(反转会多产生 $1$ 的代价)

于是设 $l=r-m$,则设 $f_{n,l,m}$ 即可得到 $\Theta(n^3)$ 的 dp。

注意到期望满足线性性,于是设 $f_{n,l}$ 表示期望,$g_{n,l}$ 表示概率,即可得到 $\Theta(n^2)$ 的 dp:

$$f_{0,0}=0,g_{0,0}=1$$ $$f_{n,l}=p_n(f_{n-1,l+1}+g_{n-1,l+1})+(1-p_n)f_{n-1,l-1}\quad(l\not=0)$$ $$g_{n,l}=p_ng_{n-1,l+1}+(1-p_n)g_{n-1,l-1}\quad(l\not=0)$$ $$f_{n,0}=p_n(f_{n-1,0}+f_{n-1,1}+g_{n-1,1})$$ $$g_{n,0}=p_n(g_{n-1,0}+g_{n-1,1})$$


接下来考虑怎么多项式搞这玩意。

这玩意很毒瘤,不是倍增也不是分治,而是倍僧套分治。。。

显然往末尾填 $p_n=0$ 对最终答案没有影响,把 $n$ 填充为 $2$ 的幂次。

注意到 $l\le n$,因此 dp 状态相当于一个等腰直角三角形

显然这玩意适合倍增

于是我们只要考虑如下直角梯形的转移

卷积允许我们作如下等腰梯形的转移

于是把梯形分成左右两段,上面就可以卷积转移

下面的转移可以分治

于是直角梯形的转移就可以分治 FFT $\Theta(n\log^2 n)$ 解决。

等腰直角三角形的转移就倍增套上直角梯形的转移就行了,

总复杂度 $T(n)=T\left(\dfrac{n}{2}\right)+\Theta(n\log^2 n)=\Theta(n\log^2 n)$

评论

acceptedzhs
@CJ_wyz 快来学习
CJ_wyz
@zqyyy 快来学习
zqyyy
@acceptedzhs 快来学习
zyh
@xyw 快来学习
Benq
@tourist Come to learn.
Benp
@Benq 别玩高仿
KimJong_un
@Benq @Benp 너희 형제는 나와 남쪽의 형제 나라인 한국처럼 서로 사랑해야 한다
Benq
这个人名字怎么和我这么像?可惜我中文没学完,不太懂他说的什么。
Benq
Why is this man's name so similar to me? Unfortunately, I didn't finish learning Chinese and didn't quite understand what he said.
Benq
The Chinese just went to the wrong set.
Fumio_Kishida
岸田文雄首相です。王さんの論文を読んでとてもうれしく思います。@wangrx

发表评论

可以用@mike来提到mike这个用户,mike会被高亮显示。如果你真的想打“@”这个字符,请用“@@”。