水题加一,然后。。。。各种TLE,,,最后用了一种其丑无比的方法高空擦边而过。。。。
嗯。。。。说明有的时候剪枝还是挺有用的样纸。。。。
#include <stdio.h>
#include <iostream>
using namespace std;
#define maxn 100010
int a[maxn],sum[maxn];
template<class T>
inline char read(T &n){
T x = 0, tmp = 1; char c = getchar();
while((c < '0' | c > '9') && c != '-' && c != EOF) c = getchar();
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return c;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
int i,j,k;
for(i=0;i<n;i++)
{
// scanf("%d",&a[i]);
read(a[i]);
if(i==0) sum[i]=a[i];
else sum[i]=sum[i-1]+a[i];
}
if(sum[n-1]%3) {printf("0\n");continue;}
int len=sum[n-1]/3;
int tmp=0,tmpp;
int ans=0;
j=k=0;
int l,r;
for(i=0;i<n;i++)
{
if(sum[i]>=len&&!j) {j=1;l=i;continue;}
if(sum[i]>=2*len&&!k) {k=1;r=i;break;}
}
tmpp=r;
for(i=l;i<=r;i++)
{
for(j=tmp;j<l;j++)
{
if(sum[i]-sum[j]==len) break;
}
if(sum[i]-sum[j]==len)
{
for(k=tmpp;k<n;k++) if(sum[k]-sum[i]==len) break;
}
if(sum[k]-sum[i]==len) {ans++;tmp=j;tmpp=k;}
}
printf("%d\n",ans);
}
return 0;
}