T683041 题解
zhujianheng · · 个人记录
30pts:
纯送分。
直接暴力枚举
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=500009;
ll a[N],s[N],n,m,ans;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
for(ll i=1;i<=n;i++)
for(ll j=i;j<=n;j++){
ll s=0;
for(ll k=i;k<=j;k++) s+=a[k];
ans+=(s<=m);
}
cout<<ans<<endl;
return 0;
}
但实际上这份代码可以获得 50pts,甚至能
但有一组数据我造的比较大,大概
60pts(测过,严格 60pts):
考虑用前缀和优化这一过程。直接把一段区间的和转化为
100pts:
考虑转化
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=500009;
ll a[N],s[N],n,m,ans;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);cout.tie(0);
cin>>n>>m;
for(ll i=1;i<=n;i++) cin>>a[i],s[i]=s[i-1]+a[i];
for(ll i=1;i<=n;i++){
ll j=lower_bound(s+1,s+1+n,s[i]+m)-(s+1);
ans+=(j-i+1);
}
cout<<ans<<endl;
return 0;
}
时间复杂度