リンク:https://codeforces.com/contest/466/problem/C
あなたは、配列んだ [1]、 [2]、...、 [ N ]、からなる n個 の整数。各部分の要素の合計が同じになるように3つの隣接部分に、配列のすべての要素を分割する方法の数を数えます。
より正式に、あなたは、インデックスの、このようなペアの数を見つける必要がある I、 J (2≤ I ≤ J ≤ nは 、その- 1) 。
入力
最初の行は、整数含ま N (1≤ nは アレイ内にあるどのように多くの数を示す、≤5・105)。二行目に含まれる n個 の整数 [1]、 [2]、...、 [ N ](| [ I ] |≤109) -配列の要素 A。
出力
同じ和と三つの部分にアレイを分割するいくつかの方法 - 単一の整数を印刷します。
例
入力
コピー
5 1 2 3 0 3
出力
コピー
2
入力
コピー
4 0 1 -1 0
出力
コピー
1
入力
コピー
2 4 1
出力
コピー
0
コード:
#include<bits/stdc++.h>
using namespace std;
long long n,t,l,r,k,s,d,ans,max1=0,b,c,mod=1e9+7;
long long m[500005],a[500005],dp[500005];
int main()
{
cin>>n;
m[0]=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
m[i]=m[i-1]+a[i];
}
if(m[n]%3!=0)
ans=0;
else
{
s=m[n]/3;
t=0;
for(int i=n;i>=1;i--)
{
t+=a[i];
if(t==s)
{
dp[i]=1;
}
dp[i]+=dp[i+1];
}
ans=0;
t=0;
for(int i=1;i<=n-2;i++)
{
t+=a[i];
if(t==s)
{
ans+=dp[i+2];
}
}
}
cout<<ans;
}