Interval

韓小妹發表於2018-08-11

題目描述

才發現編故事背景那麼難,原諒當初語文考滿分的我。對於區間L,R而言,它的長度是R−L+1,區間和則是a[L]+…+a[R]。(如果用陣列a去記錄)

注意:區間元素的下標是從1開始的。

如:序列(5,2,1,1,3,1,4) 
區間[2,4]的長度是3,區間[2,5]的區間和為2+1+1+3=7。

現在Ocean用程式隨機生成了一個序列,該序列一共有N個整數。 對於這個序列,他想知道區間長度>=L且滿足區間和>=M的不同區間有多少個?

對於兩個區間[x1,y1]和[x2,y2],若x1!=x2或者 y1!=y2 則可以認為兩個區間是不同的。

 
輸入 


第一行輸入一個整數T ,代表有T組測試資料。 每組資料佔兩行,第一行依次輸入三個整數N,L,M分別代表上面提到的資訊。 
下面一行輸入N個整數ai。

注:1<=T<=100,1<=L<=N<=10000,−100000<=M,ai<=100000。

輸出 


對每組測試資料,輸出一個整數代表最後的結果。 
樣例輸入


1 1 1 

4 2 3 
1 2 3 4 
6 3 -7 
-1 -2 -3 4 -5 6

樣例輸出



10

AC碼:

#include<cstdio>
#include<algorithm>
#include<vector>
using namespace std;
vector <long long> v;
long long sum[10010];
int main()
{
	int T,a,N,M,L;
	scanf("%d",&T);
	while(T--)
	{
		v.clear() ;
		scanf("%d %d %d",&N,&L,&M);
		for(int i=1;i<=N;i++)
		{
			scanf("%d",&a);
			sum[i]=sum[i-1]+a;
		}
		long long ans=0,l=1,r=L;
		v.push_back(0);
		while(r<=N)
		{
			long long s=sum[r]-M;
			int fr=upper_bound(v.begin(),v.end() ,s)-v.begin() ;//返回鍵值>給定元素的第一個位置
			ans+=fr;
			int fl=lower_bound(v.begin(),v.end() ,sum[l])-v.begin() ;
			v.insert(fl+v.begin() ,sum[l]);
			++l;
			++r; 
		 } 
		 printf("%lld\n",ans);
	}
	return 0;
}