hdu5289单调队列

来源:互联网 发布:淘宝新开店铺 编辑:程序博客网 时间:2024/06/17 01:04
#include <cstdio>#include <cstring>#include <queue>#include <algorithm>using namespace std ;#define LL __int64deque <LL> deq1 , deq2 ;//单调队列,deq1最大值,deq2最小值LL a[100010] ;int main() {    int t , n , i , j ;    LL k , ans ;    scanf("%d", &t) ;    while( t-- ) {        scanf("%d %I64d", &n, &k) ;        for(i = 0 ; i < n ; i++)            scanf("%I64d", &a[i]) ;        if(k == 0) {            printf("0\n") ;            continue ;        }        while( !deq1.empty() ) deq1.pop_back() ;        while( !deq2.empty() ) deq2.pop_back() ;        for(i = 0 , j = 0 , ans = 0; i < n ; i++) {//i在前,j在后            while( !deq1.empty() && deq1.back() < a[i] ) deq1.pop_back() ;            deq1.push_back(a[i]) ;            while( !deq2.empty() && deq2.back() > a[i] ) deq2.pop_back() ;            deq2.push_back(a[i]) ;            while( !deq1.empty() && !deq2.empty() && deq1.front() - deq2.front() >= k ) {                ans += (i-j) ;                //printf("%d %d,%I64d %I64d\n", i , j, deq1.front() , deq2.front() ) ;                if( deq1.front() == a[j] ) deq1.pop_front() ;                if( deq2.front() == a[j] ) deq2.pop_front() ;                j++ ;            }        }        while( j < n ) {            ans += (i-j) ;            j++ ;        }        printf("%I64d\n", ans) ;    }    return 0 ;}

原创粉丝点击