CF2006C Eri and Expanded Sets

CF2006C Eri and Expanded Sets

脑经急转弯,记录一下很妙的思路。

题意简述: 定义一个区间是 "好的" ,当且仅当将区间中的所有数插入一个空的集合中,每次使用两个奇偶性相同的集合中的数(不取出),将平均数插入集合中,使得最后集合中的数可以变为公差为 1 的等差数列。求一个数列中好的子区间个数。

数据范围: \(1\le n \le400000\)

Solution

给一个序列我们一开始没什么思路。先考虑两个数 \(x,y,(x<y)\) ,一直操作它们最后会变成什么。

我们发现,假设 \(y-x=d\) ,因为不会出现小数,最后会变成一个公差恒定的等差序列。

我们发现每插一遍公差除以 2 。所以最后的公差一定是 \(d\) 除去所有 2 的因子,设为 \(d'\)

我们再考虑三个奇偶性相同的数 \(x,y,z,(x<y<z)\) ,假设 \(z-x=a,z-y=b\)

我们先按照前面说的,补全公差为 \(a'\)\(b'\) 的等差数列。我们发现,居然出现了 \(a-b\) 状物。 我们发现这个东西很像 \(\gcd\)

对于一个区间,操作完排完序以后一定为公差为奇数的等差序列。(否则可以继续拆)

这不满足我们的条件,我们需要最后公差为 1 。于是这个东西等价于将原数组差分后求解 $ \gcd$ ,让 \(\gcd=0\)\(\gcd=2^k,k\in Z\)

剩下的东西就很喜闻乐见,扫描线/线段树二分即可。

时间复杂度为 \(O(n\log n \log V)\)\(O(n log n)\)

代码不放了。

posted @ 2024-10-04 18:36  lichenyu_ac  阅读(31)  评论(0)    收藏  举报