#include <cstdio>
#include <vector>
#include <map>
using ll = long long;
const int N = 507;
const int M = 20007;
const int T = N * M;
int n;
int arr[N];
std::map<int, int> counter;
std::vector<std::pair<int, int>> vec;
int tab[2 * T];
int search(int i, int m, int l, int r) {
while (l < r) {
int j = (l + r) >> 1;
if (-(vec[i].first + vec[j].first) > m)
l = j + 1;
else
r = j;
}
return l;
}
int main() {
scanf("%d", &n);
for (int i = 0; i < n; i++)
scanf("%d", &arr[i]);
for (int i = 0; i < n; i++) {
int s = 0;
for (int j = i; j < n; j++) {
s += arr[j];
counter[s]++;
}
}
for (auto& it: counter) {
vec.push_back(std::make_pair(it.first, it.second));
tab[T + it.first] = it.second;
}
int m = (--counter.end())->first;
int sz = vec.size();
ll r = 0;
for (int i = 0; i < sz; i++) {
int j = search(i, m, i + 1, sz - 1);
for (; j < sz; j++) {
int s = -(vec[i].first + vec[j].first);
if (s <= vec[j].first) {
break;
} else {
r += (ll)tab[T + s] * vec[i].second * vec[j].second;
}
}
}
for (int i = 0; i < sz; i++) {
int s = -(vec[i].first + vec[i].first);
if (tab[T + s]) {
if (s == 0) {
r += ((ll)tab[T + s] * (tab[T + s] - 1) * (tab[T + s] - 2)) / 6;
} else {
r += ((ll)tab[T + s] * vec[i].second * (vec[i].second - 1)) >> 1;
}
}
}
printf("%lld\n", r);
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 | #include <cstdio> #include <vector> #include <map> using ll = long long; const int N = 507; const int M = 20007; const int T = N * M; int n; int arr[N]; std::map<int, int> counter; std::vector<std::pair<int, int>> vec; int tab[2 * T]; int search(int i, int m, int l, int r) { while (l < r) { int j = (l + r) >> 1; if (-(vec[i].first + vec[j].first) > m) l = j + 1; else r = j; } return l; } int main() { scanf("%d", &n); for (int i = 0; i < n; i++) scanf("%d", &arr[i]); for (int i = 0; i < n; i++) { int s = 0; for (int j = i; j < n; j++) { s += arr[j]; counter[s]++; } } for (auto& it: counter) { vec.push_back(std::make_pair(it.first, it.second)); tab[T + it.first] = it.second; } int m = (--counter.end())->first; int sz = vec.size(); ll r = 0; for (int i = 0; i < sz; i++) { int j = search(i, m, i + 1, sz - 1); for (; j < sz; j++) { int s = -(vec[i].first + vec[j].first); if (s <= vec[j].first) { break; } else { r += (ll)tab[T + s] * vec[i].second * vec[j].second; } } } for (int i = 0; i < sz; i++) { int s = -(vec[i].first + vec[i].first); if (tab[T + s]) { if (s == 0) { r += ((ll)tab[T + s] * (tab[T + s] - 1) * (tab[T + s] - 2)) / 6; } else { r += ((ll)tab[T + s] * vec[i].second * (vec[i].second - 1)) >> 1; } } } printf("%lld\n", r); return 0; } |
English