题意:将1个数列分成三段相同和的分法
题解:首先求一个前缀和,显然第一段的和一定为sum[n]/3,第二段的节点为2sum[n]/3,直接统计就行了。注意有可能 sum[n]/3==2sum[n]/3
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e5+10;
struct node{
int p;
ll x;
}a[N],b[N];
int n;//;
ll p[N],sum[N];
bool cmp(node a,node b){
return a.x==b.x?a.p<b.p:a.x<b.x;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&p[i]);
for(int i=1;i<=n;i++){
sum[i]=sum[i-1]+p[i];
}
ll ans=0;ll cnt=0;
if(sum[n]%3!=0) printf("0\n");
else{
for(int i=1;i<n;i++){
if(sum[i]==2*sum[n]/3) ans+=cnt;//注意 sum[n]/3==2*sum[n]/3
if(sum[i]==sum[n]/3) cnt++;
}
printf("%lld\n",ans);
}
return 0;
}