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(nlog 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})

原文地址:https://www.cnblogs.com/y-dove/p/15028418.html