给定一个序列,以及k和d,找一个最长的连续子序列,满足给这个连续子序列加入至多k个数,然后从小到大排序,可以得到一个公差为d的等差数列。 k,n≤200000 0≤d≤
当d=0时随便搞搞。
当d≠0,怎样的序列可以构造出一个合法的等差数列呢? 所有数对d取模得到的值一样,并且它们除d之后,假设最大、小值分别是max,min,序列长度为len,那么
那么思路出来了!枚举区间的左端或右端,然后用两个单调栈维护最大、最小值。退栈的时候,相当于一个区间加。求答案是区间查询(注意控制查询的区间没有相同元素和模d不同的元素)。求完当前位置的答案后又要区间减1。线段树解决。 细节自行补上吧。
时间复杂度
新闻热点
疑难解答