hdu 5289 单调队列

来源:互联网 发布:java cms框架搭建 编辑:程序博客网 时间:2024/05/19 03:25
#include <iostream>#include <cstdio>#include <queue>#include <deque>using namespace std;typedef pair<int, int> P;#define maxn 100000 + 10deque<long long> Q1; //updeque<long long> Q2; //downint n, k;long long a[maxn];int main(){    int T;    scanf("%d", &T);    while(T--)    {        scanf("%d%d", &n, &k);        for(int i=1; i<=n; i++)            scanf("%I64d", &a[i]);        while(!Q1.empty()) Q1.pop_back();        while(!Q2.empty()) Q2.pop_back();        int l = 1, r = 1;        long long ans = 0;        while(r <= n)        {            while(!Q1.empty() && a[r] < Q1.back()) Q1.pop_back();//注意这里构造单调队列 如果是 < ,即为非严格单调单调增序列            Q1.push_back(a[r]);            while(!Q2.empty() && a[r] > Q2.back()) Q2.pop_back();            Q2.push_back(a[r]);            while(!Q1.empty() && !Q2.empty() && Q2.front() - Q1.front() >= k)            {                if(Q1.front() == a[l]) Q1.pop_front();                if(Q2.front() == a[l]) Q2.pop_front();                l++;            }            ans += (r - l + 1);            r++;        }        printf("%I64d\n", ans);    }    return 0;}

1 0
原创粉丝点击