CF2063F1/CF2063F2 Counting Is Not Fun 题解

· · 题解

:::::info[闲话] 模拟赛的题,太菜了,不会,打了 30pts 部分分(其实就是 F1)跑路了。
看完 F2 题解中 Ri 的 idea 大受震撼。
::::: :::::info[题目基本信息] 考察:

题目简述:

数据范围: 1. F1: - $1\le t\le 1000

这两个显然可以 \Theta(n) 统计(也可能可以用数据结构优化),这样我们就解决了 F1。
时间复杂度为 \Theta(n^2+n\log m)m=998244353 是模数,可以优化成 \Theta(n^2+\log m) 但没必要),空间复杂度为 \Theta(n)

F2 部分:

注意到上面 F1 的做法正推优化可能比较麻烦,需要上数据结构(诸如线段树,官解用了平衡树),所以我们考虑倒推删括号。
显然 ans_n=1,现在我们考虑从 ans_i 推导到 ans_{i-1}
还是上面的图,我们考虑删去黑色虚线表示的括号匹配对,这时:

siz_{lst_i}\leftarrow siz'_{lst_i}+siz_i+2

同时由于括号被删去,siz_i\leftarrow 0
同时,根据:

ans_{i+1}\leftarrow \frac{ans_iC_{(siz'_{lst_i}-siz_{i}-2)\div 2}C_{siz_i\div 2}}{C_{siz'_{lst_i}\div 2}}

我们得到:

ans_{i-1}\leftarrow \frac{ans_iC_{siz_{lst_i}\div 2}}{C_{(siz_{lst_i}-siz_{i}-2)\div 2}C_{siz_i\div 2}}

现在我们需要快速求出 lst_i
注意到删去括号等价于把括号合并到它的 lst 上,我们使用并查集维护即可。
然后做完了。
时间复杂度为 \Theta(n\alpha(n)+n\log m)(递推 Catalan 数可以做到 \Theta(n\alpha(n)),爆标了),空间复杂度为 \Theta(n)
:::::success[code] F1
F2
:::::