https://vjudge.net/problem/Gym-100247C
题意:
给出一串数,求有多少个区间的和正好等于S。
思路:
计算处前缀和,并且用map维护一下每个前缀和出现的次数。这样接下来枚举左端点即可,确定了左端点,就可以得出右端点的前缀和应该为多少。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int maxn = +;
typedef long long ll; int n;
ll s, a[maxn], sum[maxn];
map<ll,int> mp; int main()
{
//freopen("in.txt","r",stdin);
sum[] = ;
mp.clear();
scanf("%d%lld",&n,&s);
for(int i=;i<=n;i++)
{
scanf("%lld",&a[i]);
sum[i] = sum[i-]+a[i];
mp[sum[i]]++;
}
ll ans = ;
for(int i=;i<=n;i++)
{
ans += mp[s+sum[i-]];
mp[sum[i]]--;
}
printf("%lld\n",ans);
return ;
}