您的位置:首页 > 其它

codeforces 之 Number of Ways

2014-10-18 16:56 323 查看
题意分析:

就是说给你一串数字,分成三段,每段的数子的和相等,求有多少种分法。用前缀数组和S
,算出来A1=1/3S
,A2=2/3S
,求出当第I个A2出现时,前面已经有多少个A1,就对应有多少种分法。当S
=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
%3 || n<3) cout<<0<<endl;

else if(s
==0) {

cout<<(sum-1)*(sum-2)/2<<endl;

}

else {

long long s1=s
/3,s2=s
*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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: