http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1275
题意:
思路:
固定某个端点,然后去寻找满足能满足要求的最大区间,这里就用一下单调队列,一个维护最大值,一个维护最小值。
比如说,现在左端点固定为i,右端点一直往前找,直到此时的最大值-最小值>k了,此时退出,假设此时为j,那么i~j-1就是一个符合要求的最大区间。
1 #include<iostream> 2 #include<algorithm> 3 #include<cstring> 4 #include<cstdio> 5 #include<vector> 6 #include<stack> 7 #include<queue> 8 #include<cmath> 9 #include<map> 10 #include<set> 11 using namespace std; 12 typedef long long ll; 13 typedef pair<int,int> pll; 14 const int INF = 0x3f3f3f3f; 15 const int maxn = 50005+5; 16 17 int n, k; 18 ll ans; 19 int a[maxn]; 20 deque<int> qmin,qmax; 21 22 int main() 23 { 24 //freopen("in.txt","r",stdin); 25 while(~scanf("%d%d",&n,&k)) 26 { 27 ans=0; 28 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 29 for(int i=1,j=1;i<=n;i++) 30 { 31 while(j<=n) 32 { 33 while(!qmin.empty() && a[qmin.back()]>=a[j]) qmin.pop_back(); 34 qmin.push_back(j); 35 while(!qmax.empty() && a[qmax.back()]<=a[j]) qmax.pop_back(); 36 qmax.push_back(j); 37 if(a[qmax.front()]-a[qmin.front()]<=k) j++; 38 else break; 39 } 40 ans+=j-i; 41 if(qmin.front()==i) qmin.pop_front(); 42 if(qmax.front()==i) qmax.pop_front(); 43 } 44 printf("%lld ",ans); 45 } 46 return 0; 47 }