先特判,显而易见数组的前缀和必须是3的倍数,要不然分不成三份。
然后就是遍历前缀和让它和1/3总和和2/3总和比,显然当第二个1/3也成立的时候就可以停止遍历,然后可以继续遍历或者退出循环得出结果。
代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
typedef long long ll;
ll f[N],s[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++) {
cin>>f[i];
s[i] = s[i-1] + f[i];
}
if(s[n]%3) {
cout<<"0"<<endl;
return 0;
}
ll le = s[n]/3;
ll ans = 0;
for(int i=1,j=0;i<n;i++) {
if(s[i]==2*le) ans+=j;
if(s[i]==le) ++j;
}
cout<<ans<<endl;
return 0;
}
标签:遍历,int,ll,long,截断,数组,一题,include
From: https://www.cnblogs.com/2ctheworld/p/17119212.html