题目描述
一个长度为N的数组A, 所有数都是整数 ,0 <= A[i] <= 1000000,1 <= i <= N,1 <= N <= 100000,对于 任意i,j ,1 <= i <= j <= N,[i, j]中所有数为原数组的一个子区间, 现在要求子区间的和小于等于K的子区间有多少个, 0 <= K <= 10000。
虽然xry111很SB,但还是在O(N)的时间复杂度内就做出了这题,你呢?
输入
第一行整数T 代表数据组数,1 <= T <= 12
每组数据第一行 整数 N, K。
接下来一行N个整数, 由空格隔开。
输出
输出子区间的和小于等于K的子区间的个数。 每组输出占一行。
--正文
明明是简单的题,却做了半天。。。
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; long long a[100001]; int n,k,i,j; int main(){ int time,T; scanf("%d",&T); for (time=1;time<=T;time++){ int now = 1; LL sum = 0,res = 0; scanf("%d %d",&n,&k); for (i=1;i<=n;i++){ scanf("%lld",&a[i]); sum += a[i]; if (sum <= k) { res += i - now + 1; } else { while (sum > k){ sum = sum - a[now]; now ++; } res += i - now + 1; } } printf("%lld ",res); } return 0; }