CF1851D Prefix Permutation Sums 题解

· · 题解

传送门
思路好想,但是代码量不少。

题意

我们定义“前缀和排列”为:如果 a 为一个长度为 n 的排列,那么如果数列 b 满足 \forall i\in[1,n] 有 b_i=\sum\limits^i_{j=1}a_j,那么我们说 b 是 a 的“前缀和排列”。
现在有一个长度为 n-1 的数列 a,a 是一个前缀和数列且丢失了其中一项。求每次的 a 能否通过补全成为完整的“前缀和排列”。

解法

我们定义 a 的差分数组为 b。
我们易知,一个普通的“前缀和排列”的差分数组必然就是这个排列。
所以我们建一个桶来记录 b 中所有元素是否出现过。这扫一遍即可(下面设扫到 i),但是有一些特殊情况:

那么我们最后只要判断记录的数字是否等于丢下的两个数字即可。这里有特殊情况:没有记录的数字。这种情况我们需要判断桶里的数是否是正好 n-1 个,如果是,就是正确的,反之为否。
时间复杂度为 O(N),N=\sum\limits^t_{i=1}n_i,可以通过。
CODE