考虑先判无解。容易发现无解当且仅当 pL,pL+1,…,pR 中存在位置 i,j,k 满足 pi>pj>pk,或存在位置 i,j 满足 pi>pj 且区间外存在元素 x 满足 x<pj。第一类情况可以对每个位置 j 用单调栈预处理出 Lj=i,Rj=k 然后判断是否有 ∀j,l≤Lj≤Rj≤r 即可;第二类情况对每个 j 找到最靠右的位置 i 然后把信息挂在 i 上对 j 做扫描线即可 O(nlogn) 判定。
然后考虑计数。直接做原问题是困难的,先弱化问题,计数 1∼n 的排列中 LDS 长度不超过 2 的排列数量。容易想到按值插入做 dp。设 fi,j 表示当前处理到了值 i,第一个能放更大的数的位置是 j 的排列方案数。转移就是 fi,j 可以转移到 fi+1,k 当且仅当 k∈[j,i+1]。给这个东西编一个组合意义就是从 (1,1) 走到 (n+1,n+1),每一次只能向右或向上走,且不能触碰直线 y=x+1 的方案数。这个东西就是一个标准单线反射容斥形式。
然后回到原问题。容易发现此时序列中没有出现过的值不超过 i=LmaxRpi 的数必须升序排列,因此出发点就从 (1,1) 移动到了 (i=LmaxRpi,R−L+2),同样可以单线反射容斥算答案为 (n−i=LmaxRpi2n−i=LmaxRpi−(R−L+1))−(n−i=LmaxRpi−12n−i=LmaxRpi−(R−L+1)),预处理阶乘和阶乘逆即可 O(n)−O(1) 算答案。
总时间复杂度为 O(nlogn),瓶颈在于判无解的时候需要在扫描线过程中用线段树 / BIT 维护信息。
喜欢的话,留下你的评论吧~