题目大意就是问能分出几个使三个区间的和相等的分发
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <algorithm> 2 #include <stack> 3 #include <istream> 4 #include <stdio.h> 5 #include <map> 6 #include <math.h> 7 #include <vector> 8 #include <iostream> 9 #include <queue> 10 #include <string.h> 11 #include <set> 12 #include <cstdio> 13 #define FR(i,n) for(int i=0;i<n;i++) 14 #define MAX 2005 15 #define mkp pair <int,int> 16 using namespace std; 17 #include <bits/stdc++.h> 18 const int maxn = 5e5 + 40; 19 typedef long long ll; 20 const int inf = 0x3fffff; 21 void read(ll &x) { 22 char ch; bool flag = 0; 23 for (ch = getchar(); !isdigit(ch) && ((flag |= (ch == '-')) || 1); ch = getchar()); 24 for (x = 0; isdigit(ch); x = (x << 1) + (x << 3) + ch - 48, ch = getchar()); 25 x *= 1 - 2 * flag; 26 } 27 28 29 ll n; 30 ll sum[maxn],arr[maxn]; 31 ll val[maxn]; 32 ll s2[maxn]; 33 ll l[maxn]; 34 int main() { 35 read(n); 36 for(int i=0;i<n;i++)read(val[i]); 37 sum[0]=val[0]; 38 for(int i=1;i<n;i++)sum[i]+=sum[i-1]+val[i]; 39 //int i = 0,j = n-1; 40 for(int i=n-1;i>=0;i--)s2[i]+=s2[i+1]+val[i]; 41 if(sum[n-1]%3)return 0*printf("%d\n",0); 42 ll temp = 0; 43 for(int i=0;i<n;i++){ l[i]=temp; 44 if(sum[i]==sum[n-1]/3)temp++; 45 46 } 47 ll ans = 0; 48 for(int i=n-1;i>=1;i--){ 49 if(s2[i]==sum[n-1]/3){ 50 ans+=l[i-1]; 51 } 52 // cout<<ans<<endl; 53 } 54 cout<<ans<<endl; 55 return 0; 56 }