题意
定义排列的一个区间
[l,r] 为关键区间,当且仅当
[l,r] 内的数在这个区间内都出现了一次。也就是关键区间
[l,r] 是值在
[l,r] 内的数的排列。
定义一个关键区间
[l,r] 是合法的,当且仅当
r≤ml。
求有多少长度为
n 的排列不含有合法关键区间。
题解
题目相当于给定了一些区间,求让这些区间都不是合法关键区间的方案数。
考虑第一层容斥,钦定一个区间集
S,其内都是关键区间,容斥系数是
(−1)∣S∣。
一个观察是,如果两个关键区间有交,那么这个关键区间可以被拆分为三个不交关键区间。
设两个关键区间
[l1,r1],[l2,r2] 满足
l1<l2≤r1<r2。
设
[l2,r1] 不是关键区间,则其内存在
[l1,l2−1] 内的数或
[r1+1,r2] 内的数。
如果有
[l1,l2−1] 内的数,则
[l2,r2] 就不是关键区间。
如果有
[r1+1,r2] 内的数,则
[l1,r1] 就不是关键区间。
所以
[l2,r1] 是关键区间,易得
[l1,l2−1] 和
[r1+1,r2] 也是关键区间。
此时钦定的关键区间,要么不交,要么包含。
事实上,这样拆分之后,容斥仍然是对的。
因为原来要求
[l1,r1] 和
[l2,r2] 合法,已经包含内部
[l1,l2−1],[l2,r1],[r1+1,r2] 合法,后者可以拼出前者,前者可以拆出后者,要求的是一个东西,方案数是一样的。
设
f(l,r) 表示
[l,r] 不严格包含关键区间的方案数。
特别的,若
m1=n,答案为
0,否则答案为
f(1,n)。
对于
f 再套一层容斥。即设
g0/1(l,r,x) 表示在
[l,r] 中包含偶数/奇数个关键区间的方案数。
先考虑严格包含的情况。
g0(l,r,x)=g0(l,r−1,x−1)+∑i=l+1rg1(l,i−1,x)f(i,r)[r≤mi]
这里的
f(i,r)[r≤mi] 的意义是不严格包含合法关键区间的方案数。
则
f(l,r)=∑x=1r−l+1(g0(l,r,x)−g1(l,r,x))×x!
x 个空白可以随便放置,即将
x 个数安排进
x 个位置。
然后再把
g0/1 不严格包含的部分填上。
g1(l,r,x)=g1(l,r,x)+[x=0]f(l,r)[r≤ml]
也就是加上了
[l,r] 是一整个关键区间的方案数。
如果你被卡常了,可以试试交换数组维度。