题目大意
给定一个\(n\)个数的序列\(a_i\)。有\(q\)次询问,每次询问是一个非负整数\(k\),求出有多少对\((l, r)\),满足\(max(a[i]) - min(a[j]) > k\),其中\(l\le i, j \le r\)。
思路
不难发现满足要求的序列有单调性,即如果当前区间满足最大值减去最小值大于k,那么包含这个区间的更大的区间,也一定满足。
而这一类问题,通常可以采用尺取法。即:
- 我们先固定起点\(l\),然后让\(r\)从\(l\)开始一个一个往后走,并记录最大值与最小值。
- 一旦当前序列满足了条件,那么选取\(r\)之后的点作为结尾,也一定会满足,所以直接让答案\(ans += n - r + 1\),然后让\(l\)后移动一位
- 因为\(r\)在恰好满足条件的时候就不在移动了,所以\(l\)在往后移动一位的时候,满足条件的结尾一定在\(r\)点或之后,所以\(r\)的起点还是当前位置,然后继续按照第一步继续,直到统计完成。
- 因为我们需要记录区间的最大值和最小值,所以我们可以用两个单调队列来统计,即统计最大值的时候,如果新加入的数\(X\)比当前的数\(Y\)要大,那么就让\(Y\)出队,因为X比Y大还比它靠后,意味着在取最大值的时候,只要有X在,就永远不会取到Y,而X又在Y之后,也就是说它出队也晚于Y,所以Y就没有存在的必要了
(惨 Y 惨)。
代码
1 |
|
- 本文作者: 水蓝络合物
- 本文链接: https://miku39393939.github.io/2021/08/11/KingOfRange/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!