尺取虫法で十分です。
分かりやすさ優先で実装したので速度は出ていません。
#include <iostream>
#include <vector>
using namespace std;
long long int n,q,as[100002]={0};
long long int f(long long int x){
long long int r=1;
long long int ans=0;
for(long long int i=0;i<n;i++){
if(r<=i){
r=i+1;
}
while(r<=n){
long long int d=as[(int)r]-as[(int)i];
if(d>x){
r--;
break;
}
r++;
}
if(n<r)r=n;
ans+=(r-i);
//cout<<"("<<i<<" "<<r<<" "<<ans<<")";
}
return ans;
}
int main() {
// your code goes here
cin>>n>>q;
long long int sum=0;
for(int i=1;i<=n;i++){
long long int a;
cin>>a;
sum+=a;
as[i]=sum;
}
for(int i=0;i<q;i++){
long long int x;
std::cin>>x;
cout<<f(x)<<"\n";
}
return 0;
}
最終更新:2016年11月05日 18:41