[组合计数题单]括号序列
只有括号不会,不会就是不会,见到多少次都不会......
壹、题目
求有多少个长度为 \(n\) 的括号序列满足其所有子序列中最长合法括号子序列的长度恰好为 \(2k\),多组数据。
数据范围:\(n,T\le 2\times 10^5,k\le n\).
贰、题解
考虑将 (
设为 \(1\),将 )
设为 \(-1\),然后求前缀和得到 \(s_i\),那么,一个序列的最长合法括号子序列的长度就是 \(n-s_n-2|\min\{s_i\}|\).
至于这个结论是怎么证的,我们考虑从整个序列长度减去没用到的右括号与左括号,就是最长的,对于没有用到的右括号,实际上就是 \(|\min\{s_i\}|\),放到二维坐标系上是这样
每次,只要这个函数超过了之前的最小值,那么它就浪费了一个右括号,所以总共浪费的右括号就是 \(|\min\{s_i\}|\).
至于没有用到的左括号,其实就是 \(s_n+|\min\{s_i\}|\)(就是最后剩下的从最低点到最后的那一节),所以总共就是 \(n-|\min\{s_i\}|-(s_n+|\min\{s_i\}|)=n-s_n-2|\min\{s_i\}|\).
所以我们就是要找一个长度为 \(n\) 的括号序列满足 \(n-s_n-2|\min\{s_i\}|=2k\),也就是必须满足 \(s_n=n-2k-2|\min\{s_i\}|\).
暴力一点,枚举 \(\min\{s_i\}=t,|\min\{s_i\}|=-t\)(因为至少有 \(s_n=0\),所以一定满足 \(\min\{s_i\}\le 0\))则 \(s_n=n-2k+2t\),至于怎么求 \(\min\{s_i\}=t\),考虑使用简单的容斥,将 \(\min\{s_i\}\ge t\) 的方案减去 \(\min\{s_i\}\ge t-1\) 的方案,而这个东西,实际上就是
这条折线始终在 \(y=t\) 的上方(可触碰),最后到达 \(s_n\),即从 \((0,0)\) 走到 \((n,s_n)\) 而不经过 \(y=t-1\),这个是什么?这是翻折引理,方案数就是没有限制的方案数减去按直线翻折后终点的方案数,即
对于 \(\min\{s_i\}\ge t-1\) 的方案数,就是
最后的总方案数就是
这个东西似乎和 \(t\) 无关,但是我们得考虑这个 \(t\) 有好多取值,由于 \(t\) 满足不等式 \(s_n\ge \min\{s_i\}\Leftrightarrow n-2k+2t\ge t\Rightarrow t\ge 2k-n\),所以最后的答案就是
这个东西,话说这到底是怎么想到的......
叁、用到の小 \(\tt trick\)
重要定理:
对于一个括号子序列,考虑将
(
设为 \(1\),将)
设为 \(-1\),然后求前缀和得到 \(s_i\),那么,这个序列的最长合法括号子序列的长度就是 \(n-s_n-2|\min\{s_i\}|\).
翻折定理,从 \((0,0)\) 走到 \((x,y)\) 而不经过 \(y=k\) 的方案数,就是没有限制的方案数减去按直线翻折后终点的方案数。
对于没有用到的右括号,实际上就是 \(\max\{|s_i|\}\),也就是 \(|\min\{s_i\}|\),这个怎么理解,假如说我们的 \(s_i\) 放到二维坐标系上是这样