0%

影石Insta360杯-2025牛客暑期多校训练营9——G.Permutation

思路讲解

https://chatgpt.com/c/689c99ac-b064-8324-881c-c407b94bd235

G-Permutation 题目极简笔记(Notion 块级公式版)

1. 问题核心

  • 操作:两端删除元素,或查询当前最小值并把它追加到 a。

  • 共执行 n 步,问不同的 a 序列数量。

  • 输入保证为排列(每个 1…n 恰好一次)。


2. 关键性质

  1. 最小值“时代”严格递增(因为是排列,无重复)。

  2. 按“最后一个时代所属的区间”分类:

  • 不重:每个 a 只有一个最后时代;
  • 不漏:每个 a 都有最后时代。
  1. 分类后只需两个量:
  • m:到达最后时代时的区间长度(剩余元素数);
  • d:经历的时代个数(最小值更新次数 + 1)。

3. 计数模型(每个时代的 Query 次数)

下面是 q 的约束(最后一个时代至少查询一次;总查询次数不超过 m):
qd1,q1,,qd10,i=1dqimq_d \ge 1,\quad q_1,\dots,q_{d-1} \ge 0,\quad \sum_{i=1}^{d} q_i \le m

固定总查询次数 Q 的分配方案数(隔板法)为:
(Q+d2d1)\binom{Q + d - 2}{d - 1}


4. 求和得到闭式

对所有可行的 Q(从 1 到 m)求和,有:

Q=1m(Q+d2d1)=(m+d1d) \sum_{Q=1}^{m} \binom{Q + d - 2}{d - 1} = \binom{m + d - 1}{d}

因此,某个区间作为“最后时代”的贡献为:

(m+d1d) \binom{m + d - 1}{d}


5. 最终答案

把所有区间(作为最后时代)累加,再加 1(空序列):

Ans=all intervals(m+d1d)+1 \mathrm{Ans} = \sum_{\text{all intervals}} \binom{m + d - 1}{d} + 1


6. 实现要点(思路提要)

  • 用 RMQ/ST 或单调栈 + 分治,拿到每个“最后时代”区间的 m 与 d;

  • 对每个区间加上上面的组合数;最后整体再加 1。

AC代码

https://ac.nowcoder.com/acm/contest/view-submission?submissionId=78844877

上面这段代码非常好,下面仅仅只是为了测试一下zkw线段树的这个功能以及常数

心路历程(WA,TLE,MLE……)