河南理工大学算法协会暑期集训积分赛(二)网络同步赛-Numbers of interval-尺取法
原题链接:https://hpuoj.com/contest/24/problem/E/
思路:一般的尺取法,不断更新左端点的值。
1 #include<iostream> 2 #include<iomanip> 3 #include<string.h> 4 #include<set> 5 #include<map> 6 #include<stdio.h> 7 #include<queue> 8 #define inf 0x3f3f3f3f 9 const int N=1000020; 10 using namespace std; 11 typedef long long ll; 12 13 int a[N]; 14 15 int main() 16 { 17 std::ios::sync_with_stdio(false); 18 cin.tie(0); 19 cout.tie(0); 20 int n,k; 21 cin>>n>>k; 22 memset(a,0,sizeof(a)); 23 // memset(sum,0,sizeof(sum)); 24 // sum[0]=0; 25 int l=1; 26 ll sum=0,ans=0;//ans要设成ll,不然第二组数据就过不去 27 for(int i=1; i<=n; i++) 28 { 29 cin>>a[i]; 30 //sum[i]=sum[i-1]+a[i]; 31 sum+=a[i]; 32 while(l<=i&&sum>=k) 33 { 34 // l++; 35 ans=ans+n-i+1; 36 sum-=a[l]; 37 l++; 38 } 39 } 40 cout<<ans<<endl; 41 return 0; 42 }
这是直接调用库函数的一种写法(和上面的原理一样):
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=1e6+100; 4 typedef long long ll; 5 long long a[N],sum[N]; 6 int main() 7 { 8 int n,k; 9 cin>>n>>k; 10 for(int i=1; i<=n; i++) 11 { 12 cin>>a[i]; 13 sum[i]=sum[i-1]+a[i]; 14 } 15 16 long long ans=0; 17 for(int l=1; l<=n; l++) 18 { 19 int id=lower_bound(sum+1,sum+n+1,k+sum[l-1])-sum; 20 ans+=(n-id+1); 21 } 22 cout<<ans<<endl; 23 return 0; 24 }