三轮省集 day7
很好的一场。
20+20+50.
感觉 T3 的 50pts 推的很厉害。
第一个包直接搜所有排列。
考虑第二个包 \(2k>n\) 的限制。由于题目要求对于 \(ik<j\le (i+1)k\),\(a_i\ge a_i\),再加上题目给出的是一个排列,直接把等号去掉。相当于 \(a_1\sim a_{k}>a_0\),\(a_{k+1}\sim a_{n}>a_1\)。后面的数不用考虑。
所以相当于我们要对所有符合要求且小于 \(a\) 的排列计数,设 \(b\) 是一个这样的序列。一个套路,令 \(f_{i,j}\) 代表 \(b\) 的前 \(i-1\) 位和 \(a\) 相同,第 \(i\) 位为 \(j\) 的 \(b\) 有多少。
一个显然的观察是 \(a_0=b_0=1\)。所以从 \(f_{i\le k,j}\) 开始考虑。
设 \(b\) 已经用过的数的集合为 \(S\),没用过的数的集合为 \(S'\),\(S'\) 中大于 \(a_1\) 的数为 \(p\)。
显然我们应该在 \(b_{k+1}\sim b_n\) 中填上 \(n-k-1\) 个大于 \(a_1\) 个数。这部分相当于 \(A_p^{n-k-1}\)。
而至于 \(i+1\sim k\) 位,我们可以随便填这部分相当于 \((k-i)!\)。
所以对于 \(i\le k\),\(f_{i,j}=(k-i)!A_{p}^{n-k-1}\)。
接下来考虑 \(f_{i>k,j}\),仍然有 \(p\) 的定义。
这时候的一个必要条件是 \(j>a_1\)。此时我们同样对剩下的数随便填,方案数为 \(A_{p}^{n-i-1}\)。
现在考虑 \(p\) 的求法,我们维护 \(a\) 的一段前缀中有多少数 \(>a_1\),加加减减即可。
注意,当 \(i=1\) 时,我们应该统计的是有多少数 \(>j\),而不是 \(a_1\)。
我们没有必要枚举 \(j>a_i\),这样 \(b\) 的字典序会比 \(a\) 大,没有必要。
赛时没有这个部分分的样例,差评,自己拍了 2w 组。
code。
T1 也是组合数,还没会。