Problem link : http://codeforces.com/contest/466/problem/C
Logic:
Let sum of elements in array = S
If S%3==0 then the array cannot be divided into 3 equal parts . So print zero.
Otherwise,
Have a count array where count[i]=number of subarrays in arr[i…n] whose sum is equal to S/3
Now iterate from the first element and add elements to a variable called “temp”
At iteration i, if temp==S/3 then we have found first part of the “3 equal parts array”.count[i+2] will give you the number of ways the rest of the 2 equal parts of the array could be arranged.
The logic here is “if arr[0…i] sums upto S/3 and if arr[i+j…n] sums upto S/3 then inbetween elements arr[i+1…j-1] will also sum upto S/3 ” here j varies from 2 to n-2.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <vector> | |
#include <list> | |
#include <map> | |
#include <set> | |
#include <deque> | |
#include <queue> | |
#include <stack> | |
#include <bitset> | |
#include <algorithm> | |
#include <functional> | |
#include <numeric> | |
#include <utility> | |
#include <sstream> | |
#include <iostream> | |
#include <iomanip> | |
#include <cstdio> | |
#include <cmath> | |
#include <cstdlib> | |
#include <ctime> | |
#include <cstring> | |
#include <climits> | |
#include <stdlib.h> | |
#include <stdio.h> | |
using namespace std; | |
#define REP(i,n) for(int i=0; i<n; i++) | |
#define FOR(i,st,end) for(int i=st;i<end;i++) | |
#define db(x) cout << (#x) << " = " << x << endl; | |
#define mp make_pair | |
#define pb push_back | |
#define MAX 10000005 | |
typedef long long int ll; | |
int arr[1000005]; | |
int count1[1000005]; | |
int main(){ | |
int n; | |
cin>>n; | |
ll s=0; | |
REP(i,n){ | |
cin>>arr[i]; | |
s+=arr[i]; | |
} | |
if(s%3!=0){ | |
cout<<"0"; | |
return 0; | |
} | |
ll sum=s/3; | |
ll temp=0; | |
for(int i=n-1;i>=0;i--){ | |
temp+=arr[i]; | |
if(temp==sum){ | |
count1[i]+=1; | |
} | |
} | |
for(int i=n-2;i>=0;i--){ | |
count1[i]+=count1[i+1]; | |
} | |
temp=0; | |
ll ans=0; | |
for(int i=0;i+2<n;i++){ | |
temp+=arr[i]; | |
if(temp==sum){ | |
ans+=count1[i+2]; | |
} | |
} | |
cout<<ans; | |
} |