//Sylwia Sapkowska
#include <bits/stdc++.h>
#pragma GCC optimize("O3", "unroll-loops")
using namespace std;
void __print(int x) {cerr << x;}
void __print(long long x) {cerr << x;}
void __print(long double x) {cerr << x;}
void __print(char x) {cerr << "'" << x << "'";}
void __print(const char *x) {cerr << '"' << x << '"';}
void __print(const string &x) {cerr << '"' << x << '"';}
void __print(bool x) {cerr << (x ? "true" : "false");}
template<typename T, typename V>
void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';}
template<typename T>
void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";}
void _print() {cerr << "]\n";}
template <typename T, typename... V>
void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);}
#ifdef LOCAL
#define debug(x...) cerr << "[" << #x << "] = ["; _print(x)
#else
#define debug(x...)
#endif
#define int long long
typedef pair<int, int> T;
const int A = 3e7;
int tab[2*A+7];
void solve(){
int n; cin >> n;
vector<int>a(n+1), pref(n+1);
for (int i = 1; i<=n; i++) {
cin >> a[i];
pref[i] = pref[i-1] + a[i];
}
int ans = 0;
for (int l2 = n; l2 >= 1; l2--){
for (int l1 = n; l1 >= 1; l1--){
for (int r1 = n; r1 >= l1; r1--){
tab[pref[r1]-pref[l1-1]+pref[l2]+A]++;
}
}
for (int l1 = n; l1 >= 1; l1--){
for (int r1 = n; r1 >= l1; r1--){
int sum = pref[r1] - pref[l1-1] - pref[l2-1];
ans += tab[-sum+A];
}
}
}
debug(ans);
//odjac gdy pewne dwa sa rowne
//pierwsze dwa rowne, ten pozniejszy wiekszy
memset(tab, 0, sizeof(tab));
for (int l1 = n; l1 >= 1; l1--){
for (int r1 = n; r1 >= l1; r1--){
ans -= 3*tab[-2*(pref[r1]-pref[l1-1])+A];
tab[pref[r1]-pref[l1-1]+A]++;
}
}
debug(ans);
memset(tab, 0, sizeof(tab));
for (int l1 = 1; l1 <= n; l1++){
for (int r1 = l1; r1 <= n; r1++){
ans -= 3*tab[-2*(pref[r1]-pref[l1-1])+A];
tab[pref[r1]-pref[l1-1]+A]++;
}
}
//wszystkie trzy rowne(?) --> czyli kazdy ma sume 0
for (int l = 1; l <= n; l++){
for (int r = l; r <= n; r++){
if (pref[r] == pref[l-1]){
debug(l, r);
ans--;
}
}
}
cout << ans/6 << "\n";
}
int32_t main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
solve();
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | //Sylwia Sapkowska #include <bits/stdc++.h> #pragma GCC optimize("O3", "unroll-loops") using namespace std; void __print(int x) {cerr << x;} void __print(long long x) {cerr << x;} void __print(long double x) {cerr << x;} void __print(char x) {cerr << "'" << x << "'";} void __print(const char *x) {cerr << '"' << x << '"';} void __print(const string &x) {cerr << '"' << x << '"';} void __print(bool x) {cerr << (x ? "true" : "false");} template<typename T, typename V> void __print(const pair<T, V> &x) {cerr << '{'; __print(x.first); cerr << ", "; __print(x.second); cerr << '}';} template<typename T> void __print(const T &x) {int f = 0; cerr << '{'; for (auto &i: x) cerr << (f++ ? ", " : ""), __print(i); cerr << "}";} void _print() {cerr << "]\n";} template <typename T, typename... V> void _print(T t, V... v) {__print(t); if (sizeof...(v)) cerr << ", "; _print(v...);} #ifdef LOCAL #define debug(x...) cerr << "[" << #x << "] = ["; _print(x) #else #define debug(x...) #endif #define int long long typedef pair<int, int> T; const int A = 3e7; int tab[2*A+7]; void solve(){ int n; cin >> n; vector<int>a(n+1), pref(n+1); for (int i = 1; i<=n; i++) { cin >> a[i]; pref[i] = pref[i-1] + a[i]; } int ans = 0; for (int l2 = n; l2 >= 1; l2--){ for (int l1 = n; l1 >= 1; l1--){ for (int r1 = n; r1 >= l1; r1--){ tab[pref[r1]-pref[l1-1]+pref[l2]+A]++; } } for (int l1 = n; l1 >= 1; l1--){ for (int r1 = n; r1 >= l1; r1--){ int sum = pref[r1] - pref[l1-1] - pref[l2-1]; ans += tab[-sum+A]; } } } debug(ans); //odjac gdy pewne dwa sa rowne //pierwsze dwa rowne, ten pozniejszy wiekszy memset(tab, 0, sizeof(tab)); for (int l1 = n; l1 >= 1; l1--){ for (int r1 = n; r1 >= l1; r1--){ ans -= 3*tab[-2*(pref[r1]-pref[l1-1])+A]; tab[pref[r1]-pref[l1-1]+A]++; } } debug(ans); memset(tab, 0, sizeof(tab)); for (int l1 = 1; l1 <= n; l1++){ for (int r1 = l1; r1 <= n; r1++){ ans -= 3*tab[-2*(pref[r1]-pref[l1-1])+A]; tab[pref[r1]-pref[l1-1]+A]++; } } //wszystkie trzy rowne(?) --> czyli kazdy ma sume 0 for (int l = 1; l <= n; l++){ for (int r = l; r <= n; r++){ if (pref[r] == pref[l-1]){ debug(l, r); ans--; } } } cout << ans/6 << "\n"; } int32_t main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); solve(); return 0; } |
English