三轮省集 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 也是组合数,还没会。

posted @ 2024-06-26 15:58  BYR_KKK  阅读(29)  评论(0)    收藏  举报