Codeforces 1333C - Eugene and an array(前缀和 计数)

讲解:https://www.cnblogs.com/stelayuri/p/12664224.html
求区间和考虑前缀和
计数问题重点应该是如何分类可以不重不漏。
i和j前缀和相等说明(i+1,j)的区间和为0.
求以i为右节点的满足条件的区间个数,就是i和i之前和为零的区间的左节点的最大值。

#include
#include
#include
#include
#include
typedef long long ll;
using namespace std;
const int N=2e5+10;
map<ll,int> mp;
int main()
{
	int n;
	cin>>n;
	ll ar,sum=0,ans=0,maxl=1;
	mp[0]=1;
	for(int i=2;i<=n+1;i++)
	{
		cin>>ar;
		sum+=ar;
		if(mp[sum]!=0)
		{
			maxl=max(maxl,ll(mp[sum]+1));
			
		}
		ans+=i-maxl;
		mp[sum]=i;
	}
	 cout<<ans<<endl;
	 
}

你可能感兴趣的:(cf,计数,前缀和)