/* * Opis: Główny nagłówek */ #include<bits/stdc++.h> using namespace std; using LL=long long; #define st first #define nd second #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif void brute(int n, vector<int> &tab) { } int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<int> tab(n); for (int &v : tab) { cin >> v; } vector<int> sums; REP(i, n) { int sum = 0; FOR(j, i, n-1) { sum += tab[j]; sums.push_back(sum); } } sort(sums.begin(), sums.end()); vector<pair<int, int> > merged; int curr = sums.front(); int ile = 0; REP(i, ssize(sums)) { if (curr != sums[i]) { merged.push_back({curr, ile}); curr = sums[i]; ile = 0; } ile++; } merged.push_back({curr, ile}); ile = 0; debug(ssize(merged)); // debug(sums); // debug(merged); LL res = 0; FOR(i, 0, ssize(merged)) { int ptr = ssize(merged)-1; FOR(j, i, ssize(merged)-1) { if (merged[i].st + merged[j].st > 0) { break; } if (ptr < j) { break; } LL spos = merged[i].nd; if (j == i) { spos *= merged[j].nd - 1; spos /= 2; } else { spos *= merged[j].nd; } while (ptr > j && merged[i].st + merged[j].st + merged[ptr].st > 0) { ptr--; } if (merged[i].st + merged[j].st + merged[ptr].st == 0) { if (i == j && j == ptr) { spos *= merged[ptr].nd-2; spos /= 3; } else if (j == ptr) { spos *= merged[ptr].nd-1; spos /= 2; } else { spos *= merged[ptr].nd; } res += spos; } } } cout << res << "\n"; }
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 92 93 94 95 96 97 | /* * Opis: Główny nagłówek */ #include<bits/stdc++.h> using namespace std; using LL=long long; #define st first #define nd second #define FOR(i,l,r)for(int i=(l);i<=(r);++i) #define REP(i,n)FOR(i,0,(n)-1) #define ssize(x)int(x.size()) #ifdef DEBUG auto&operator<<(auto&o,pair<auto,auto>p){return o<<"("<<p.first<<", "<<p.second<<")";} auto operator<<(auto&o,auto x)->decltype(x.end(),o){o<<"{";int i=0;for(auto e:x)o<<","+!i++<<e;return o<<"}";} #define debug(X...)cerr<<"["#X"]: ",[](auto...$){((cerr<<$<<"; "),...)<<endl;}(X) #else #define debug(...){} #endif void brute(int n, vector<int> &tab) { } int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<int> tab(n); for (int &v : tab) { cin >> v; } vector<int> sums; REP(i, n) { int sum = 0; FOR(j, i, n-1) { sum += tab[j]; sums.push_back(sum); } } sort(sums.begin(), sums.end()); vector<pair<int, int> > merged; int curr = sums.front(); int ile = 0; REP(i, ssize(sums)) { if (curr != sums[i]) { merged.push_back({curr, ile}); curr = sums[i]; ile = 0; } ile++; } merged.push_back({curr, ile}); ile = 0; debug(ssize(merged)); // debug(sums); // debug(merged); LL res = 0; FOR(i, 0, ssize(merged)) { int ptr = ssize(merged)-1; FOR(j, i, ssize(merged)-1) { if (merged[i].st + merged[j].st > 0) { break; } if (ptr < j) { break; } LL spos = merged[i].nd; if (j == i) { spos *= merged[j].nd - 1; spos /= 2; } else { spos *= merged[j].nd; } while (ptr > j && merged[i].st + merged[j].st + merged[ptr].st > 0) { ptr--; } if (merged[i].st + merged[j].st + merged[ptr].st == 0) { if (i == j && j == ptr) { spos *= merged[ptr].nd-2; spos /= 3; } else if (j == ptr) { spos *= merged[ptr].nd-1; spos /= 2; } else { spos *= merged[ptr].nd; } res += spos; } } } cout << res << "\n"; } |