这个题是个水题, 只要统计分割点之间的匹配关系就可以, 但是自己就是做不对,因为自己分割点弄混了, 导致接二连三的出错,最后答案可能是long long 以为1e5 全是零就超INT了。
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1e5+10;
int num[maxn], sum[maxn], tt1[maxn], cnt1, tt2[maxn], cnt2;
int main(){
int n;
scanf("%d", &n);
for(int i=1; i<=n; i++)
{
scanf("%d", num+i);
sum[i]=sum[i-1]+num[i];
}
if(sum[n]%3 != 0)
{
printf("0\n");
return 0;
}
int stand=sum[n]/3;
for(int i=1; i<n; i++)
{
if(sum[i]==stand)
{
tt1[++cnt1]=i+1;
}
}
for(int i=1; i<n; i++)
{
if(sum[i]==stand*2)
{
tt2[++cnt2]=i+1;
}
}
long long ans=0;
for(int i=1; i<=cnt1; i++)
{
int *p=upper_bound(tt2+1, tt2+1+cnt2, tt1[i]);
ans+=(tt2+cnt2-p+1);
}
printf("%I64d\n", ans);
return 0;
}