也许是最后一篇(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})