1 import java.util.*; 2 3 public class Main { // 注意类名必须为Main 4 public static void main(String[] args) { 5 Scanner scan = new Scanner(System.in); 6 int number = Integer.parseInt(scan.nextLine()); 7 // number个测试样例 8 for (int k = 0; k < number; k++){ 9 // 输入数据 10 String str = scan.nextLine(); 11 int num = Integer.parseInt(scan.nextLine()); 12 String[] strs = str.split(" "); 13 int n = strs.length; 14 int[] arr = new int[n]; 15 for (int i = 0; i < n; i++) 16 arr[i] = Integer.parseInt(strs[i]); 17 // 特殊情况,num<0,所有子数组都满足条件 18 if (num < 0) { 19 System.out.println(n*(n+1)/2); 20 } else { 21 int sum = 0; 22 // 两个双端队列,存储窗口内最大值和最小值 23 LinkedList<Integer> qmax = new LinkedList<>(); 24 LinkedList<Integer> qmin = new LinkedList<>(); 25 int l = 0; 26 int r; 27 for (r = 0; r < n; r++) { 28 // 将第r个元素插入qmax 29 while (!qmax.isEmpty() && arr[r] > arr[qmax.getLast()]) 30 qmax.pollLast(); 31 qmax.addLast(r); 32 // 将第r个元素插入qmin 33 while (!qmin.isEmpty() && arr[r] < arr[qmin.getLast()]) 34 qmin.pollLast(); 35 qmin.addLast(r); 36 // 如果差值超过num 37 if (arr[qmax.getFirst()] - arr[qmin.getFirst()] > num) { 38 // 计算个数 39 sum += n-r; 40 // 将指针l指向的元素去除 41 if (l == qmax.getFirst()) 42 qmax.pollFirst(); 43 if (l == qmin.getFirst()) 44 qmin.pollFirst(); 45 // 左指针右移一格 46 l++; 47 // 右指针暂时保持不动 48 r--; 49 } 50 } 51 System.out.println(sum); 52 } 53 } 54 scan.close(); 55 } 56 57 }