题解
2026-08-31 19:46:47
发布于:浙江
9阅读
0回复
0点赞
可以用双端队列来解,运用滑动窗口就可以轻松做,一个记录最大值,一个记录最小值,再用双指针就可以了
#include<bits/stdc++.h>
using namespace std;
long long ans=0;
long long n[200010];
int main()
{
int a,b;
cin>>a>>b;
for(int i=1;i<=a;i++){
cin>>n[i];
}
deque<long long> ma,mi;
int l=1;
for(int r=1;r<=a;r++){
while(!ma.empty()&&n[r]>=n[ma.back()]){
ma.pop_back();
}
ma.push_back(r);
while(!mi.empty()&&n[r]<=n[mi.back()]){
mi.pop_back();
}
mi.push_back(r);
while(n[ma.front()]-n[mi.front()]>b){
if(ma.front()==l){
ma.pop_front();
}
if(mi.front()==l){
mi.pop_front();
}
l++;
}
ans+=(r-l+1);
}
cout<<ans;
return 0;
}
也是非常简短且清晰
这里空空如也







有帮助,赞一个