码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2017-10-07 16:08:00      阅读:128      评论:0      收藏:0      [点我收藏+]

标签:get   stream   amp   51nod   targe   else   push   printf   long   

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 连续字段的差异(单调队列)

标签:get   stream   amp   51nod   targe   else   push   printf   long   

原文地址:http://www.cnblogs.com/zyb993963526/p/7634678.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!