AGC055C
题面
link
给定\(n,m\),求长度为\(n\)且满足下面条件的数列\(A\)的数量。
- \(2\le a_i\le m (1 \le i \le n)\)
- 存在一个排列\(P\),使\(\forall i\in [1,n],A_i\)等于数列\([p_1,p_2...p_{i-1},p_{i+1}...p_{n}]\)的最长上升子序列的长度。
题解
首先要确定,\(\forall i,a_i=K/K-1\),并且当\(a_i=K-1\)的时候,含义是\(p_i\)在所有最长上升子序列(LIS)中。
设\(p_{b_1},p_{b_2}...p_{b_p}\)为\(P\)中,在所有LIS的数构成的序列(即我们现在有\(p\)个位置\(a_i=K-1\)),然后我们要考虑究竟有多少个\(K\)的取值。
你会发现\(K\)的下界是\(p\)(不然根本不能有这么多必在LIS中的数),然后考虑上界,其实就是在\(p_{b_i}+1\sim p_{b_{i+1}}-1\)中的数,要让这些数形成最大的最长LIS长度,并且还能计算到整个序列的LIS中,而且还不能存在一个出现在所有LIS中的数。要满足以下要求:
- 首先要知道只有在\([p_{b_i}+1,p_{b_{i+1}}-1]\)的数才可能对整个序列的LIS产生贡献,但因为所有的\(P\)都是你来钦定,所以没有太多影响影响。
- 然后考虑不存在出现在所有LIS中的数,最优的放置方法就是设\(s=p_{b_{i+1}}-p_{b_i}-1\),然后前\(\lfloor\frac{s}{2}\rfloor\)放一个以\(p_{b_i}+\lfloor\frac{s}{2}\rfloor+1\)为起始的公差为\(1\)的等差序列,接着在来一个以\(p_{b_i}+1\)为起始的公差为\(1\)的等差序列,最后一个数在放一个不会影响的数,可以证明是存在这样的方案的。
所以\(K\)的上界就是\(\sum\lfloor \frac{s}{2}\rfloor\),又可以证明,对于\(\forall K\in[p,\sum\lfloor \frac{s}{2}\rfloor]\),总存在一种构造方案。
所以我们可以枚举\(i=p,j=\sum\lfloor \frac{s}{2}\rfloor\),可以知道奇数段的长度是\(n-i-2j\)(因为只有奇数段才会出现除2下取整使\(i+2j<n\)的情况)
然后我们在所有\(i+1\)中选择\(n-i-2j\)的作为奇数段方案数为\(\binom{i+1}{n-i-2j}\),然后就是将\(j\)个\(2\)放进\(i+1\)个盒子(允许空盒)的方案为\(\binom{i+j}{i}\),\(K\)的取值有\(\max(0,\min(m,i+j)−\max(3,i)+1)\)种,乘起来,再加起来就可以了。
关于上面被证明存在的构造方案:大致构造思路是先将\(K\)分配(貌似是怎么分配都可以,但为了方便,还是选择全分给左边),然后就分配了的一块就按上面的构造方法,没有分配(是一段后缀)的就是一段小的降序序列。
扩展
有没有想过如果题目是给你一个序列,让你求\(A\)怎么办,其实就像给序列分层,设\(f[i]\)表示以\(i\)结尾的LIS长度,那么第\(j\)层相当于所有\(f[i]=j\)的都是这一层的点,然后若这一层只有一个点能够转移到下一层,那么这个\(a_i=K-1\),否则\(a_i=K\)
启发
- 好好了解了LIS的问题,包括后面的扩展。