题意:
给出一个数列a。
需要求出一个最长的子串加入不超过k个数,能够形成公差为d的等差数列。
题解:
形成公差为d的等差数列的条件:
1.不存在相同的数
2.所有的数应该在模d下同余
3.若设max为区间最大值,min为区间最小值,应该满足:
(max−min)/d−(i−j)<=k
如何实现?
设b=a%d,c=a/d
先将b相同的一段段区间搞出来->for一遍
将上面的式子变一下:
max(c)−min(c)+j<=k+i
考虑枚举右端点:
在同一个区间,维护左边的那个值的区间最小值。
对于一个右端点可以影响到的位置->可以用单调栈预处理最为最大最小值会影响到的位置。
维护左边的那个值的区间最小值,需要维护
max(c)+j
和
−min(c)+j
的区间最小值。
通过线段树分治可以找出对应位置。线段树分治,就是在线段树上找到对应区间然后再找对应的最左或者最右的位置。
对于,区间内出现相同的。。。不难的。
注意几点:
1.大视野此题数据弱,可以在codeforces上交407E
2.负数不能直接除