Interval
題目描述
才發現編故事背景那麼難,原諒當初語文考滿分的我。對於區間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。
輸出
對每組測試資料,輸出一個整數代表最後的結果。
樣例輸入
3
1 1 1
1
4 2 3
1 2 3 4
6 3 -7
-1 -2 -3 4 -5 6
樣例輸出
1
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;
}
相關文章
- leetcode–57–Insert IntervalLeetCode
- LeetCode之Insert Interval(Kotlin)LeetCodeKotlin
- 巧妙設定job的interval
- oracle interval日期函式的bug!Oracle函式
- 如何實現一個Interval HookHook
- [LeetCode] 57. Insert Interval 插入區間LeetCode
- oracle的interval時間格式的總結Oracle
- AT_arc166_d [ARC166D] Interval Counts
- 如何在React中優雅的使用Interval(輪詢)React
- [20181017]ORA-01873 the leading precision of the interval is too small.txt
- Oracle查詢Interval partition分割槽表內資料Oracle
- [20210418]ORA-14767 Cannot specify this interval with existing high bounds.txt
- interval 分割槽表clob預設表空間指定問題
- SciTech-Mathmatics-Probability+Statistics-Population:Region-Sampling of Region : Confidence Interval(置信區間)IDE
- 使用函式RP_CALC_DATE_IN_INTERVAL進行日期的年月日的加減函式