NOI2018 冒泡排序

打表发现满足条件的序列上升的部分占绝大多部分,考虑从这个性质下手。

对于最优的情况,显然是每一步都会让两个元素都想有利于自己的方向前进,所以如果出现了长度大于等于 33 的下降子序列,那么就是一定不合法的。

具体的,因为如果出现 33 个以上的下降序列那么他就即需要向前走也需要向后走就不合法了,考虑用 DP 来计数。

fi,jf_{i,j} 表示前 ii 个位置的最大值为 jj 的情况下后面 nin-i 个位置的方案数,容易理解 iji\le j

如果填比 jj 大的数,那么一定可以接在 jj 的后面;如果要填比 jj 小的数,那么必须填当前还没有填的中最小的,否则上升子序列将不止 22 个,所以:

fi,j=k=jnfi+1,kf_{i,j}=\sum\limits_{k=j}^n f_{i+1,k}

用图像表示这样的地推,那么 fi,jf_{i,j} 就相当于从 (i,j)(i,j) 走到 (n,n)(n,n) 不穿过 y=x1y=x-1 的方案数。

利用类似于卡特兰数的思路,我们可以得到:

fi,j=(2nij1ni1)(2nij1nj2)f_{i,j}={2n-i-j-1\choose n-i-1}-{2n-i-j-1\choose n-j-2}

套路的,我们去枚举前缀一样的长度。

考虑分讨,写一个前缀和优化然后乱作即可。

注意到不是很显然,记录一下。

我们记 mxmx 表示 [1,i)[1,i)qq 中的 max\maxmnmn 表示还没有用过的最小的数,那么显然为了避免出现长度为 33 的下降子序列,我们这个位置只能填 {mn}(mx,+)\{mn\}\cup(mx,+\infty) 中的数。

考虑 qiq_i 对这个位置的限制,因为我们枚举的是前缀,所以这个位置可以放的就只有 (qi,+)(q_i,+\infty) 的数。

但是由于定义,iqi<mn\nexists i\mid q_i<mn,于是我们得到并集为 (max(mx,qi),+)(\max(mx,q_i),+\infty)

特别的,如果 qi(mn,mx)q_i\in(mn,mx) 那么这个位置之后就一定是不合法的,因为 mx,qi,mnmx,q_i,mn 就一定构成了一个 33 个元素的下降子序列,直接停止就行了。

需要考虑的问题就是答案的一堆 ff 加起来怎么求,注意到:

j=lnfi,l=fi1,l\sum\limits_{j=l}^n f_{i,l}=f_{i-1,l}

于是求和即可,时间复杂度为 O(Tn)O(Tn)

CF1342E Placing Rooks

容易想到,只需要保证每一行或者每一列有车就行了。

不妨设每一列都必须有车,那么如果需要有 kk 组车相互可以攻击,那么就只需要把 nn 个车放到 nkn-k 行,每一行都至少有一个。

如果不理解,不妨继续手玩一下,那么枚举有几个空盒子容斥就行了。

Ans=(nnk)×2i=0nk(nki)×(1)i×(nki)nAns={n\choose n-k}\times2\sum\limits_{i=0}^{n-k} {n-k\choose i}\times(-1)^i\times(n-k-i)^n

时间复杂度为 O(nlogn)O(n\log n)

SP106 Binary Stirling Numbers

对于 {nm}\begin{Bmatrix}n\\m\end{Bmatrix} 有递推式子:

{n+1m}={nm1}+m×{nm}\begin{Bmatrix}n+1\\m\end{Bmatrix}=\begin{Bmatrix}n\\m-1\end{Bmatrix}+m\times \begin{Bmatrix}n\\m\end{Bmatrix}

那么得到:

{nm}={n1m1}+m×{n1m}\begin{Bmatrix}n\\m\end{Bmatrix}=\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+m\times \begin{Bmatrix}n-1\\m\end{Bmatrix}

所以在模 22 意义之下就是:

{nm}={{n1m1}m is even.{n1m1}+{n1m}Otherwise.\begin{Bmatrix}n\\m\end{Bmatrix}=\left\{\begin{matrix}\begin{Bmatrix}n-1\\m-1\end{Bmatrix} & m\text{ is even.} \\\begin{Bmatrix}n-1\\m-1\end{Bmatrix}+\begin{Bmatrix}n-1\\m\end{Bmatrix} & \text{Otherwise.}\end{matrix}\right.

那么使用数形结合的思想,就相当于:

如果在位置 (x,y)(x,y) 那么有情况:

  • 如果 yy 是奇数那么只能从 (x1,y1)(x-1,y-1) 转移过来。
  • 否则可以从 (x1,y)(x-1,y) 或者 (x1,y1)(x-1,y-1) 转移过来。

那么假设有 dd 行可以横着走,那么 d=M+12d=\lfloor\dfrac{M+1}{2}\rfloor 则方案数位:

(nm+d1d1){n-m+d-1\choose d-1}

所以怎么判断一个组合数的奇偶性呢,有结论只有 n&m=mn\&m=m 的时候 (nm)n\choose m 才是奇数。