給你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]