51nod 1275 连续字段的差异(单调队列)

Posted 谦谦君子,陌上其华

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod 1275 连续字段的差异(单调队列)相关的知识,希望对你有一定的参考价值。

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\\n",ans);
45     }
46     return 0;
47 }

 

以上是关于51nod 1275 连续字段的差异(单调队列)的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1821 最优集合(思维+单调队列)

51nod 1158 全是1的最大子矩阵(单调栈 ,o(n*m))

[51nod1138]正整数分解为几个连续自然数之和

HDU -1506 Largest Rectangle in a Histogram&&51nod 1158 全是1的最大子矩阵 (单调栈)

51nod1276(xjb)

51nod 1102 面积最大的矩形 && 新疆大学OJ 1387: B.HUAWEI's billboard 单调栈+拼凑段(o(n) 或 o(nlog(n))