#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i = a; i < b;++i)
#define pb emplace_back
#define mp make_pair
#define f first
#define s second
#define int long long
using namespace std;
const int prze = 1000 * 1000 * 20;
int tab[prze * 2];
int32_t main(){
cin.tie(0);
ios_base::sync_with_stdio(0);
int n;
cin>>n;
vector<int> V;
int max1 = 0,min1 = 0;
vector<pair<int,int>> V1;
FOR(i,0,n){
int x;
cin>>x;
V.pb(x);
}
FOR(i,0,n){
int suma = V[i];
++tab[suma + prze];
max1 = max(max1,suma);
min1 = min(min1,suma);
FOR(j,i + 1,n){
suma+=V[j];
++tab[suma + prze];
max1 = max(max1,suma);
min1 = min(min1,suma);
}
}
min1 = max(min1,0 - (prze / 2));
max1 = min(max1,prze / 2);
FOR(i,prze + min1,prze + max1 + 1){
if(tab[i] > 0){
V1.pb(mp(i - prze,tab[i]));
}
}
int wyn = 0,z1 = 0,wyn1 = 0;
FOR(i,0,V1.size()){
int x = tab[prze + V1[i].f];
--tab[prze + V1[i].f];
FOR(j,i,V1.size()){
int w2 = 1;
if(i == j && V1[i].f == 0){
w2 = 2;
}
int y = max(tab[prze + V1[j].f],z1);
--tab[prze + V1[j].f];
int k = max(tab[prze - V1[i].f - V1[j].f],z1);
wyn1+=((x * y * k) / w2);
++tab[prze + V1[j].f];
}
++tab[prze + V1[i].f];
}
wyn1/=3;
wyn+=wyn1;
cout<<wyn;
}
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 | #include <bits/stdc++.h> #define FOR(i,a,b) for(int i = a; i < b;++i) #define pb emplace_back #define mp make_pair #define f first #define s second #define int long long using namespace std; const int prze = 1000 * 1000 * 20; int tab[prze * 2]; int32_t main(){ cin.tie(0); ios_base::sync_with_stdio(0); int n; cin>>n; vector<int> V; int max1 = 0,min1 = 0; vector<pair<int,int>> V1; FOR(i,0,n){ int x; cin>>x; V.pb(x); } FOR(i,0,n){ int suma = V[i]; ++tab[suma + prze]; max1 = max(max1,suma); min1 = min(min1,suma); FOR(j,i + 1,n){ suma+=V[j]; ++tab[suma + prze]; max1 = max(max1,suma); min1 = min(min1,suma); } } min1 = max(min1,0 - (prze / 2)); max1 = min(max1,prze / 2); FOR(i,prze + min1,prze + max1 + 1){ if(tab[i] > 0){ V1.pb(mp(i - prze,tab[i])); } } int wyn = 0,z1 = 0,wyn1 = 0; FOR(i,0,V1.size()){ int x = tab[prze + V1[i].f]; --tab[prze + V1[i].f]; FOR(j,i,V1.size()){ int w2 = 1; if(i == j && V1[i].f == 0){ w2 = 2; } int y = max(tab[prze + V1[j].f],z1); --tab[prze + V1[j].f]; int k = max(tab[prze - V1[i].f - V1[j].f],z1); wyn1+=((x * y * k) / w2); ++tab[prze + V1[j].f]; } ++tab[prze + V1[i].f]; } wyn1/=3; wyn+=wyn1; cout<<wyn; } |
English