模拟赛 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}\),于是我们考虑算包含的括号区间对数。
咋算?我们枚举大区间的长度然后算小区间,得到答案:
于是做完啦!

浙公网安备 33010602011771号