#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