Victor’s Research
题目链接: C - Victor’s Research Gym - 100247C
题意
求一个数组中有多少非空区间满足和为s
思路
和上一题一样的套路,记sum[i]=∑_(k=1)^i▒a_k ,那么题目就变成了求多少对(l,r)满足sum[r]-sum[l-1]=s,用map计数即可。
注意sum[0]=1,答案会爆int。
代码
#include <bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i = (int)j;i <= (int)k;i ++)
#define per(i,j,k) for(int i = (int)j;i >= (int)k;i --)
#define debug(x) cerr<<#x<<" = "<<(x)<<endl
#define mmm(a,b) memset(a,b,sizeof(a))
#define pb push_back
typedef double db;
typedef long long ll;
const int MAXN = (int)1e6+7;
const int INF = (int)0x3f3f3f3f;
ll sum[MAXN];
map<ll,ll>mp; //val -> nums
int main()
{
int N;
ll S;
scanf("%d %lld",&N,&S);
ll ans = 0;
mp[0] = 1;
rep(i,1,N) {
ll tmp;
scanf("%lld",&tmp);
sum[i] = sum[i-1] + tmp;
if (mp[sum[i]-S]) ans += mp[sum[i]-S];
mp[sum[i]] ++;
}
printf("%lld\n",ans);
}