22周赛 - Virtual Judge (vjudge.net)
题意:先给两个数n,k。n代表数组长度,k代表所求区间和。
然后下一行给出n个数。求有几个区间和等于k
思路:看到区间和,想到前缀和。用数组sum存储前缀和,那么区间[l,r]的和为sum[r]-sum[l-1];然后用map存储答案出现的次数;
注意:如果区间只有一个数,并且值为所求的数也是合理答案所以mp[0]=1;
代码
#include<iostream>
#include<map>
#define ll long long
using namespace std;
const int N=5e5+10;
ll sum[N];
int main()
{
ll n,k;
cin>>n>>k;
map<ll,ll>q;
ll ans=0;
q[0]=1;
for(int i=1;i<=n;i++)
{
ll x;
cin>>x;
sum[i]=x+sum[i-1];
ans+=q[sum[i]-k];
q[sum[i]]++;
}
cout<<ans<<endl;
return 0;
}