#include <bits/stdc++.h> #define MAX_A 10143549 using namespace std; long long dodatnie[MAX_A]; long long ujemne[MAX_A]; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n; cin >> n; int a[n]; for(int i = 0; i < n; i++){ cin >> a[i]; } vector<int> dod, uje; long long zer = 0; int sum, maxdod = 0, maxuje = 0; for(int i = 0; i < n; i++){ sum = 0; for(int j = i; j < n; j++){ sum += a[j]; if(sum > 0){ if(!dodatnie[sum]){ dod.push_back(sum); maxdod = max(maxdod, sum); } dodatnie[sum]++; } else if(sum == 0) zer++; else if(sum < 0){ if(!ujemne[-sum]){ uje.push_back(-sum); maxuje = max(maxuje, -sum); } ujemne[-sum]++; } } } long long wynik = (zer*(zer-1)*(zer-2))/6; sort(dod.begin(), dod.end()); sort(uje.begin(), uje.end()); int dodsajz = (int)dod.size(); int ujesajz = (int)uje.size(); for(int i = 0; i < dodsajz; i++){ wynik += dodatnie[dod[i]] * ujemne[dod[i]] * zer; wynik += ((dodatnie[dod[i]] * (dodatnie[dod[i]]-1))/2) * ujemne[dod[i]*2]; if(dod[i]%2 == 0) wynik += ((ujemne[dod[i]/2] * (ujemne[dod[i]/2]-1))/2) * dodatnie[dod[i]]; for(int j = i+1; j < dodsajz; j++){ if(dod[i] + dod[j] > maxuje) break; wynik += dodatnie[dod[i]] * dodatnie[dod[j]] * ujemne[dod[i] + dod[j]]; } } for(int i = 0; i < ujesajz; i++){ for(int j = i+1; j < ujesajz; j++){ if(uje[i] + uje[j] > maxdod) break; wynik += ujemne[uje[i]] * ujemne[uje[j]] * dodatnie[uje[i] + uje[j]]; } } cout << wynik; 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 | #include <bits/stdc++.h> #define MAX_A 10143549 using namespace std; long long dodatnie[MAX_A]; long long ujemne[MAX_A]; int main(){ ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n; cin >> n; int a[n]; for(int i = 0; i < n; i++){ cin >> a[i]; } vector<int> dod, uje; long long zer = 0; int sum, maxdod = 0, maxuje = 0; for(int i = 0; i < n; i++){ sum = 0; for(int j = i; j < n; j++){ sum += a[j]; if(sum > 0){ if(!dodatnie[sum]){ dod.push_back(sum); maxdod = max(maxdod, sum); } dodatnie[sum]++; } else if(sum == 0) zer++; else if(sum < 0){ if(!ujemne[-sum]){ uje.push_back(-sum); maxuje = max(maxuje, -sum); } ujemne[-sum]++; } } } long long wynik = (zer*(zer-1)*(zer-2))/6; sort(dod.begin(), dod.end()); sort(uje.begin(), uje.end()); int dodsajz = (int)dod.size(); int ujesajz = (int)uje.size(); for(int i = 0; i < dodsajz; i++){ wynik += dodatnie[dod[i]] * ujemne[dod[i]] * zer; wynik += ((dodatnie[dod[i]] * (dodatnie[dod[i]]-1))/2) * ujemne[dod[i]*2]; if(dod[i]%2 == 0) wynik += ((ujemne[dod[i]/2] * (ujemne[dod[i]/2]-1))/2) * dodatnie[dod[i]]; for(int j = i+1; j < dodsajz; j++){ if(dod[i] + dod[j] > maxuje) break; wynik += dodatnie[dod[i]] * dodatnie[dod[j]] * ujemne[dod[i] + dod[j]]; } } for(int i = 0; i < ujesajz; i++){ for(int j = i+1; j < ujesajz; j++){ if(uje[i] + uje[j] > maxdod) break; wynik += ujemne[uje[i]] * ujemne[uje[j]] * dodatnie[uje[i] + uje[j]]; } } cout << wynik; return 0; } |