神题。
记 \(f_{a,b,c,d}\) 表示四个数排名依次为 \(a,b,c,d\) 的子序列的方案数(最小的排名为 \(1\),以此类推)。
闪电图腾就是 \(f_{1,3,2,4}\),山峰图腾 A 为 \(f_{1,2,4,3}\),B 为 \(f_{1,4,3,2}\)。
我们所求的式子是 \(f_{1,3,2,4}-f_{1,2,4,3}-f_{1,4,3,2}\)。
\(=(f_{1,x,2,x}-f_{1,4,2,3})-(f_{1,2,x,x} - f_{1,2,3,4})-(f_{1,4,x,x}-f_{1,4,2,3})\)。这里的 \(x\) 表示子序列中这个数排名无限制。
可以化简得到 \(f_{1,x,2,x}-f_{1,2,x,x}+f_{1,2,3,4}-f_{1,4,x,x}\)。
进一步得到 \(f_{1,x,2,x}-f_{1,x,x,x}+f_{1,3,x,x}+f_{1,2,3,4}\)。
然后我们考虑如何求这四个值。
我们定义 \(L(i)\) 和 \(R(i)\)。\(L(i)\) 表示下标小于 \(i\) 的数中,\(y\) 值小于 \(i\) 的数个数;\(R(i)\) 表示下标大于 \(i\) 的数中,\(y\) 值小于 \(i\) 的数的个数。
显然可以通过树状数组来求出 \(L(i)\),然后我们思考 \(R(i)\) 等于什么。考虑到 \(y\) 是一个排列,也就是说整个数组中 \(y_j < y_i\) 的 \(j\) 一共有 \(y_i-1\) 个,也就是说,\(L(i)+R(i)=y_i-1\)。所以我们可以通过 \(L(i)\) 和 \(y_i\) 推得 \(R(i)\)。
有了 \(L(i)\) 和 \(R(i)\),考虑怎么求上面四个 \(f\) 值:
简单题,但是非常巧妙。
\(f_{1,x,x,x}\) 是容易的。扫到 \(i\) 的时候,剩下三个数只要比 \(y_i\) 大即可。而下标大于 \(i\) 的数中,比 \(y_i\) 大的数有 \(n-i-R(i)\) 个,求组合数得到对于每个 \(i\) 答案为 \(C_{n-i-R(i)}^{3}\)。
然后求 \(f_{1,x,2,x}\)。我们不妨枚举每个 \(2\) 的位置,那么右边的贡献显然是 \(n-i-R(i)\),而左边有一定难度。
注意到如果仅仅考虑排名为 \(1\) 的那个数,方案数为 \((i-1)L(i)\)。这样子多算了两种情况:
-
排名为 \(1\) 的数在另外一个数右边或者重合。方案数为所有下标小于 \(i\),\(y\) 值小于 \(y_i\) 的数的编号和,因为只要另外一个数不在排名为 \(1\) 的数右边就不合法。可以树状数组维护。
-
另外一个数比 \(y_i\) 小。方案数为 \(C_{L(i)}^{2}\)。
减去即可。
接下来求 \(f_{1,3,x,x}\)。不妨枚举 \(3\),排名为 \(4\) 的数显然有 \(n-i-R(i)\) 中选法。只考虑排名为 \(1\) 的数,显然有 \(L(i)(y_i-1)\) 种选法,需要减去两种情况:
-
选择的排名为 \(2\) 的数在 \(3\) 左边,不能接受。方案数为 \(C_{L(i)}^2\)。
-
选择的排名为 \(2\) 的数比排名为 \(1\) 的数小,不能接受。方案数为所有下标比 \(i\) 小且 \(y\) 值比 \(y_i\) 小的数的 \(y\) 值和。用树状数组。
最后求 \(f_{1,2,3,4}\)。依然枚举 \(3\)。排名为 \(4\) 的数有 \(n-i-R(i)\) 种选法,每个下标小于 \(i\) 且 \(y\) 值小于 \(i\) 的数都可以作为 \(2\),假设下标为 \(j\),排名为 \(1\) 的数就有 \(L(j)\) 种选法。开树状数组统计即可。
至此,你已经秒掉了这道题。