Atcoder Grand Contest 023 A题解
题意
给定一个数字序列,想知道有多少种选择子序列的方式使得子序列和为0.
笺释
子序列A如果一定是从序列的头部开始向后的,这时候我们只需要选择尾部使得A的和为0,这时候我们知道当离散的sum曲线在某一点i处取得值为0时,这是一个尾部的选择方式。
以此类推,子序列A如果不一定是从序列头部开始的,而是以任意起点s为头部,那么只需要寻找终点e使得sum(s)==sum(e)。
完整代码
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
map<ll,ll>mp;
mp[0]++;
ll sum=0;
ll ret=0;
for(int i=1;i<=n;i++)
{
int x;
cin>>x;
sum+=x;
ret+=mp[sum];
mp[sum]++;
}
printf("%lld\n",ret);
}