闲扯
这道题 $JKLover$ 讲过,然后补课的时候老师也提到了,想了想还是做了吧,顺便写篇题解纪念一下。
题面
Solution
对于一个序列,如果它排序后能构成一个公差为 $d$ 等差数列,一定满足一下几点:
- $max-min=d\cdot(len-1)$ 。
- $gcd_{k=i}^{j-1}(val_{k+1}-val_k)=d$ 。
- 序列中没有重复元素。
前两个条件很好维护,直接上线段树即可,所以我们需要着重解决的是第 $3$ 个条件。
有一个很巧妙的方法,我们可以求出每一个元素,它在序列中上一次出现的位置,如果这一个区间中所有元素上一次出现位置的最大值小于 $l$ ,那么一定没有重复元素。
因为数据范围很大,而且是强制在线,所以我们用 $map$ 套 $set$ 存一下,单点修改时注意下边界条件即可。
需要注意的是一个数的数列也算是等差数列,还有在 $d=0$ 时我们直接判断最大值是否等于最小值即可。
Code
1 |
|
总结
这道题需要考虑到能构成等差数列的多种条件,而且边界需要特别注意,但是好像能用 $hash$ 乱搞过去。
就直接存一下区间最大,最小,区间和,元素的平方和,立方和,然后对于 $d$ ,我们根据最大值和最小值,算出以上的 $3$ 个值的 $hash$ 值,然后判断相等即可。