#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; } |
English