题解:P16433 [APIO 2026 中国赛区] 上升
容斥做法
先考虑全
有个基本的思路是,先确定
不难想到可以对上升子段做 DP,设
但这样显然会算多,比如对于一个划分方案 ../...,贡献为
也就是对于一个划分方案,我们希望只计算断点处是下降的排列数。按照上述 DP 方式计算的方案不会考虑这一限制。
不妨考虑容斥,设一个划分方案的断点集合为
这样也不太好直接 DP,我们可以把原方案的
然后考虑怎么推广到一般情况。
对于原本就给定的上升位置,贡献是固定的,最后再乘即可。
我们只需考虑
如果划分的子段
发现这时候不能随便选排列了,必须满足形如
对于
设
- 设
e_i=\sum\limits_{j=1}^{i}[p_j=0] ,v_i=\sum\limits_{j=1}^{i}[\nexists p_k=j] , - 若
p_i\ne 0 且p_{i-1}\ne 0 ,f_{i,j}=f_{i-1,j} 。 - 否则往前枚举一个子段
[k,i] ,设a=\prod\limits_{t=k}^{i-1}(w_t-1) ,- 若
p_i=p_k=0 ,f_{i,j} \gets f_{k-1,j} \cdot \binom{e_i-j}{i-j+1} \cdot a 。 - 若
p_i=0,p_k\ne 0 ,枚举t 表示钦定几个数<p_k ,记len=i-j,lst=j-t ,f_{i,j}\gets f_{k,lst}\cdot (-1)^{t} \cdot \binom{v_{p_k}-lst}{t} \cdot \binom{e_i-j}{len-t} \cdot a 。 - 若
p_i\ne 0,p_k\ne 0 ,也是枚举t ,记len=i-k-1,lst=j-len ,f_{i,j}\gets f_{k,lst}\cdot (-1)^{t} \cdot \binom{v_{p_k}-lst}{t} \cdot \binom{v_{p_i}-lst-t}{num-t} \cdot a 。 - 若
p_i\ne 0,p_k=0 ,记len=i-k,lst=j-len ,f_{i,j}\gets f_{k-1,lst}\cdot\binom{v_{p_i}-lst}{len}\cdot a 。
- 若
看起来是
Code