HDU-5289<two pointers>

来源:互联网 发布:linux坏了怎么卸载 编辑:程序博客网 时间:2024/06/10 14:01

题意:

求一个数列中存在多少个区间,每个区间内的数的差不超过k;

思路:two_pointers;

#include<iostream>#include<cstdio>#include<set>#include<algorithm>using namespace std;const int N=1e5+5;int n,a[N],k;int main (){    int t;  scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&k);        for(int i=1;i<=n;i++)    scanf("%d",a+i);        multiset<int>m;        long long ans=0;        for(int l=1,r=1;l<=n;l++)        {            while(r<=n)            {              if(m.size())                  if(a[r]-*m.begin()>=k||*m.rbegin()-a[r]>=k)                      break;                m.insert(a[r++]);            }            ans+=r-l;            m.erase(m.find(a[l]));        }        printf("%lld\n",ans);    }    return 0;}


0 0