连续区间和大于等于某个数(弱化版)
题目描述::
给你一个数组a(长度<=1e6)和整数m,要求有多少个连续区间和大于等于m;
输入描述::
第一行两个整数 c,m 分别表示数组大小和m
第二行 c个数组元素,0<c[i]<1e5;
输出描述::
一个整数表示所求的个数
思路分析::
假设区间 l~r 满足要求,当你再找寻合法区间是,要麽 l 右移 要麽 r 右移,这样就跟明显了
代码:复杂度 O(n)
1 #include<bits/stdc++.h> 2 #define ll long long 3 #define pii pair<int,int> 4 using namespace std; 5 const int maxn=1e6+5; 6 int c[maxn]; 7 8 int main() 9 { 10 int n,m; 11 scanf("%d%d",&n,&m); 12 for(int i=1;i<=n;i++){ 13 scanf("%d",&c[i]); 14 } 15 ll sum=0,ans=0; 16 int j=1; 17 for(int i=1;i<=n;i++){ 18 sum+=c[i]; 19 if(sum>=m){ 20 ans+=(n-i+1); 21 while(j<=i){ 22 sum-=c[j]; 23 if(sum>=m){ 24 ans+=(n-i+1); 25 j++; 26 } 27 else{ 28 break; 29 } 30 } 31 } 32 } 33 printf("%lld\n",ans); 34 return 0; 35 }
纵使单枪匹马,也要勇闯天涯