首先我们会进行的操作比较多,考虑先从一些特殊的操作入手,你发现几乎所有的操作都可以用后面操作删去的点当第 k+1 个点,唯独最后一次操作不行,所以一定存在一个没被删去的点满足其前后均有至少 k 个未被删去的点,由于没法找到其他比较好的条件,下面试说明这个条件的充分性(必要性已经说明)。
不妨令删去的位置集合为 S,我们从最后一个操作开始往前推就是不断删去 S 中数的过程,可行进行至少一次删除一个充分条件是存在一个不存在于 S 中的数(下文称其为删除中心),满足其前后至少各有 k 个存在于 S 中的数,只要证明从一个可以操作的状态出发可以一直操作知道 S 为空就可以说明条件的充分性,考虑构造如下策略:在每次操作时假若删除中心左右数同样多,挨着删除中心删,那么删除中心依然是删除中心,否则假若左边数多,在左边挨着删除中心删 k-1 个数,右边挨着删除中心删 k 个数,此时 S 集合的中位数一定在删除中心左边,将其删去后其就可以变为删除中心。
知道了充要条件,考虑计数,不妨枚举一共删去了多少数(枚举量为 \sum_k \frac{n}{2 \times k} = O(n \log n)),假若删去了 2 \times m \times k 个数,那么删除方案不合法当且仅当删去的数中除了前后 k-1 个数,剩下的数连成了一段,我们考虑将这段缩起来,于是方案映射到在 n - (2 \times m \times k - 2 \times k + 2) + 1 个数中选出 2 \times k - 1 个数,将选出的数中的中位数变回一个长度为 2 \times m \times k - 2 \times k + 2 的连续段即可映射到原方案,不难发现这是一个双射,预处理组合数后即可简单计算。