题目要求连续一段子数组和为k,用前缀和可得区间和
枚举左右边界时间复杂度为,数据大小为2e5,时间复杂度还需优化
通过map将当前区间和记录,转而求map中存在值等于sum-k
需注意前缀和r-l(l可能为0)
#include<iostream>
#include<map>
using namespace std;
const int N=2e5+5;
long long n,k,num[N];
map<long long,long long> cnt;
int main()
{
cin>>n>>k;
long long x,res=0;
cnt[0]=1;
for(int i=1;i<=n;i++)
{
cin>>x;
num[i]+=num[i-1]+x;
res+=cnt[num[i]-k];
cnt[num[i]]=cnt[num[i]]+1;
}
cout<<res;
}