求满足条件的所有子数组个数,数据量过大,可尝试用滑窗:
1.当前和sum<x时,一直右滑;
2.当前和sum>=x时,right指针不必再往后移动,此时符合条件的数组个数已知;所以尝试让left指针收缩。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner in=new Scanner(System.in);
int n=in.nextInt(),x=in.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=in.nextInt();
}
int left=0,right=0,sum=0;
long ans=0;
while(right<n){
//检查sum
sum+=arr[right];
if(sum>=x){
//从right~n-1的个数,就是符合条件的子数组个数
ans+=n-right;
//尝试收缩left
// 1.left=right
// 直接让right++,left++
if(left==right){
right++;
left++;
sum=0;
}else{
// 2.left<right
// 当满足sum>=x时,让left一直收缩
sum-=arr[left];
left++;
while(left<=right&&sum>=x){
// 同上
ans+=n-right;
sum-=arr[left];
left++;
}
//跳出循环时:1.left>right,需要重新统计;2.sum<x,right需要后移
right++;
}
}else{
right++;
}
}
System.out.println(ans);
}
}