-
1275 连续子段的差异
- 题意:询问 最值差不超过k的连续子序列的个数
- 思路:两个单调队列,一个维护单调增,一个维护单调减,从前往后遍历序列,维护的含义为以当前i为终点
- 的最长合法子序列,那么这段最长子序列中以i为终点的小子序列的个数自然就是 这段最长序列的长度
- 长度的计算是,让不满足题意的最大最小值,靠左的那个出队,让留下的尽可能长,不要漏掉情况
- 然后长度计算本来是序列 : 右-左+1,现在的右就是当前的i,而左呢就是最后一个不合法的出队的位置的下一个
- 所以长度计算成了 i-(id+1)+1=i-id
-
#include<bits/stdc++.h> using namespace std; #define maxn 56789 int n,k,a[maxn],id,ans; int main() { deque<int>mi,ma; scanf("%d%d",&n,&k); for(int i=1; i<=n; i++) scanf("%d",&a[i]); for(int i=1; i<=n; i++) { while(!ma.empty()&&a[i]>a[ma.back()]) ma.pop_back(); ma.push_back(i); while(!mi.empty()&&a[i]<a[mi.back()]) mi.pop_back(); mi.push_back(i); while(a[ma.front()]-a[mi.front()]>k) { id=min(ma.front(),mi.front()); if(id==ma.front())ma.pop_front(); else mi.pop_front(); } ans+=i-id; } printf("%d\n",ans); return 0; }
1275 连续子段的差异-单调队列-序列最值差
