模拟赛 T2 题解

第一次觉得自己计数怎么这么菜。

这题场上就有 3 人过了(oeis 发力),我场后琢磨了好久才懂,旁边的 zac 一眼题解就看懂了。%%%

题意:给定一个括号序列 \(c\),求满足 \(c_{p_i}\) 合法的 \(p\)\(p\) 的逆序对数之和。支持交换 \(c\),要求复杂度线性。

为了方便记 \(m=\cfrac{n}{2}\)

我们考虑拆贡献到每个逆序对上。

考虑如果知道了 \(c\)\(p\)()\(q\))(,所有合法括号序列的 () 个数之和 \(x\))( 个数之和 \(y\) 怎么做。

发现 \(p+q=m^2, x+y=m^2C_m\)

发现其本质不同的逆序对有 \(py+qx\) 种,但因为所有左括号和右括号都有 \((m-1)!\) 的方案是算重的,所以要乘上 \((m-1)!^2\)。然后除此之外还要加上左右括号内部的逆序对即 \(m!^2\binom{m}{2}C_{m}\),因此答案为 \((py+qx)(m-1)!^2 + m!^2\binom{m}{2}C_{m}\)

然后考虑怎么算 \(p,q,x,y\)。对于 \(p,q\) 我们可以讲 ( 看作 \(0\)) 看作 \(1\),维护 \(c\) 的逆序对数,但这样复杂度比较炸。但发现交换了俩玩意儿后的逆序对数恰好加上或减去俩东西的距离(若变合法了则减去,否则加上)。于是 \(O(n)\) 维护。

对于 \(x,y\) 他是固定的,于是推式子,我们显然只需要算出 \(y\) 就行了。如何算 \(y\)?发现 )( 与相离的两个括号区间一一对应。这启发我们统计相离的括号区间对数,但难统计,我们可以统计包含的括号区间对数。两个的和为 \(\binom{m}{2}C_{m}\),于是我们考虑算包含的括号区间对数。

咋算?我们枚举大区间的长度然后算小区间,得到答案:

\[y=\sum_{i=1}^{n-1} (2(n-i)-1)iC_iC_{n-i-1} \]

于是做完啦!

posted @ 2025-08-01 22:28  Infter  阅读(14)  评论(0)    收藏  举报