给你n个数和一个数k,求存在多少个区间的最大值减最小值小于等于k
用一个单调递增序列和一个单调递减序列维护一下数列,维护的时候,每一次把下标小的数从队列中删除。因为这个数已经对后面的答案造不成影响。然后从左到右不断遍历。如果满足条件的话,就加上这个区间长度。
#include
#include
#include
using namespace std; int last,head; int n,m,k; int a[111111]; int que1[111111]; int que2[111111]; int pa[111111]; int pb[111111]; 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]); } int l1=0; int l2 = 0; long long ans = 0; int l = 0; int r1 = -1; int r2 = -1; for(int i=1;i<=n;i++){ while(l1<=r1&&a[que1[r1]]>a[i]) --r1; while(l2<=r2&&a[que2[r2]]
=k){ if(que1[l1]
?