codeforces 之 Number of Ways

来源:互联网 发布:图片采集软件 编辑:程序博客网 时间:2024/06/17 07:39

题意分析:

就是说给你一串数字,分成三段,每段的数子的和相等,求有多少种分法。用前缀数组和S[N],算出来A1=1/3S[N],A2=2/3S[N],求出当第I个A2出现时,前面已经有多少个A1,就对应有多少种分法。当S[N]=0,当做特例处理。

代码如下:

#include<iostream>
#include<cstdio>
using namespace std;
long long s[500005],a;
int main()
{
long long n,i,sum=0;
s[0] = 0;
cin>>n;
for(i=1; i<=n; i++) {
cin>>a;
s[i]=s[i-1]+a;
if(s[i] == 0) sum++;
}
if(s[n]%3 || n<3) cout<<0<<endl;
else if(s[n]==0) {
cout<<(sum-1)*(sum-2)/2<<endl;
}
else {
long long s1=s[n]/3,s2=s[n]*2/3,ans=0,co=0;
for(i=1; i<=n; i++) {
if(s[i]==s2) ans+=co;
if(s[i]==s1) co++;
}
cout<<ans<<endl;
}
return 0;
}

0 0
原创粉丝点击