统计有多少组i,j,使得sum[1,i].sum[i,j],sum[j+1,n]相等
考虑的东西太少了,fst了。。不说了。。刚开始少考虑了2*sum/3 可能在 sum/3后面的。。
/***********************************************\
|Author: YMC
|Created Time: 2014/9/13 0:15:56
|File Name: c.cpp
|Description:
\***********************************************/
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <string>
#include <cstring>
#include <algorithm>
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <queue>
#include <stack>
#define L(rt) (rt<<1)
#define R(rt) (rt<<1|1)
#define mset(l,n) memset(l,n,sizeof(l))
#define rep(i,n) for(int i=0;i<n;++i)
#define maxx(a) memset(a, 0x3f, sizeof(a))
#define zero(a) memset(a, 0, sizeof(a))
#define srep(i,n) for(int i = 1;i <= n;i ++)
#define MP make_pair
const int inf=0x3f3f3f3f ;
const double eps=1e-8 ;
const double pi=acos (-1.0);
typedef long long ll;
using namespace std;
ll da[500005];
int n;
ll sum;
int main() {
//freopen("input.txt","r",stdin);
scanf("%d",&n);
sum = 0;
rep(i,n){
scanf("%I64d",&da[i]);
sum += da[i];
}
if(sum == 0){
ll ss = 0;
ll ss1 = 0;
for(int i=0;i<n;++i){
ss += da[i];
if(ss == 0) ss1 ++;
}
if(ss1 == 1 || ss1 == 2) {
cout<<0<<endl;
return 0;
} else {
cout<<(1+ss1-2)*(ss1-2)/2<<endl;
return 0;
}
}
ll tt = sum / 3;
if(tt * 3 != sum){
puts("0");
return 0;
}
ll t1 = tt;ll t2 = tt*2;
ll tt1 = 0,tt2 = 0;
ll su = 0;
ll cc = 0;
ll ans = 0;
rep(i,n){
su += da[i];
if(su == t2) ans += cc;
if(su == t1) cc ++;
//if(su == t2) tt2 ++;
}
cout<<ans<<endl;
return 0;
}
本文介绍了一种算法,用于计算一个整数数组能够被划分为三个连续子数组部分的方法数量,这三个部分的元素总和相等。讨论了输入输出格式、时间及内存限制,并通过样例展示了算法的应用。
.
1514

被折叠的 条评论
为什么被折叠?



