FJ省队集训2021
也许是最后一篇\(blog\)了
呐,别说这么悲伤的事情
哪怕只有10%的希望,我也要付出100%的努力
D6T1(消失的序列).
题意:略
solution:
我们考虑什么样的序列是不合法的,我们考虑这么从大到小考虑,考虑最大值,那么显然在最大值前面,栈必须为空,否则如果最大值塞入栈中且栈不为空,那么一定不会合法
先不考虑字典序的限制
那么我们可以沿最大值割开,设位置为 \(mx\) ,那么下标\(1-(mx-1)\)的值域也恰为\([1,mx-1]\),\(mx+1,n\)的值域为\([mx,n-1]\)
归纳一下,我们可以发现不合法当且仅当存在 \(i,j,k\),使得\(i < j < k\),且\(s_k < s_i < s_j\)
我们考虑一个桶,我们不妨将存在的位置叫做黑色,否则白色,从小到大扫过去,如果你在\(p_j\)前面有白色在黑色前面,那么一定不合法,因为设那个黑色为\(i\),白色为\(k\),那么一定有\(i < j < k\),且\(s_k < s_i < s_j\)
然后我们考虑限制,那么假设\(1-i\)都相等,然后\(p_{i+1} > A_{i+1}\),那么我们可以发现,我们接下来要填的位置一定是第一个黑色的连续段,且满足 \(Catalan\) 的递推公式,后面的 \(Catalan\) 数的连乘积我们可以事先维护,第一段(我们需要决策)的答案类似于
\(\sum_{i = 0}^x C_i * C_{a-i}\)
咋一看是\(n^2\),但是我们注意到每次相当于把一个白色段划成两个,那么意味着如果我们可以在\(O(min\{x,a-x\})\)的复杂度做,复杂度就是\(O(n\log n)\)
那么我们只需在 \(a-x < x\)时计算\(\sum_{i = 0}^{a}C_i*C_{a-i} - \sum_{i=x+1}^aC_i*C_{a-i}\)即可
\(\sum_{i = 0}^{a}C_i*C_{a-i} = C_{a+1}\)