AGC028B题解

提供一个不用期望的做法。
考虑一个区间 \([l,r]\) 的贡献,就是这段区间的和乘上有多少排列的权值要用到这段区间。
现在讨论有多少排列的权值有这段区间
这段区间会被用到当且仅当 \(l-1\)\(r+1\) 均出现在 \(l\sim r\) 的前面,即把这个区间分裂出来。
为了避免出错,这里进行分类讨论:

  • 如果这个区间靠边,则仅需要 \(l-1\)\(r+1\) 在前面,个数为 \(\frac{n!}{len+1}\)\(len\) 为区间长度)。
  • 如果这个区间不靠边,则需要 \(l-1\)\(r+1\) 都在区间前面出现,个数为 \(\frac{2n!}{(len+1)(len+2)}\)
    关于这个式子的理解
    先只考虑 \(l-1\),方案数为 \(\frac{n!}{len+1}\),现在对于 \(l-1\) 和这个区间的合法排列(即 \(l-1\) 出现在区间前面)\(r+1\)\(len+2\) 种放法插入期间,其中合法的只有 \(2\) 种,即放在 \(l-1\) 的前面或者后面,相当于每 \(len+2\) 种方案取 \(2\) 种方案。

容易发现,这个方案数只跟区间长度及是否靠边有关,与区间的位置无关,因此现在只需要统计长度为 \(len\) 的区间的权值和,这是比较容易的,考虑每个数在长为 \(len\) 的线段从左往右滑的过程中被覆盖几次,很容易预处理。
所以枚举区间长度统计答案就行了。
细节

  • 长度为 \(n\) 的区间单独讨论。
  • 在统计长度为 \(len\) 的答案时是否靠边也要讨论。
posted on 2022-11-07 19:58  cool_tyl  阅读(15)  评论(0)    收藏  举报