VOJ - Victor's Research (想法)

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);
}

猜你喜欢

转载自blog.csdn.net/qq_40513946/article/details/81174629