• 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
    ",ans);
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    第一次博客园作业
    弹性布局/流动式布局
    元素在网页或视口上位置的相关问题求解
    element
    给body设置高度
    盒模型宽高的获取和设置
    选择器
    变量、作用域和内存问题
    js之捕捉冒泡和事件委托
    transition transform animate的使用
  • 原文地址:https://www.cnblogs.com/zyb993963526/p/7634678.html
Copyright © 2020-2023  润新知