//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; } |