#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<int> vec(n); int count_positive = 0; for (int i = 0; i < n; ++i) { cin >> vec[i]; if(vec[i] > 0) ++count_positive; } //判断数组中的正数有没有3个以上 没有直接输出0 if(count_positive < 3) { cout << 0 << endl; return 0; } // 计算前缀和 vector<int> prefix_sum(n + 1, 0); for (int i = 1; i <= n; ++i) { prefix_sum[i] = prefix_sum[i - 1] + vec[i - 1]; } // 如果总和不能被 3 整除,直接输出 0 int total = prefix_sum[n]; if (total % 3 != 0) { cout << 0 << endl; return 0; } int target = total / 3; // 记录 [0, i) 内最后一个正数的下标 vector<int> max_idx(n + 1, -1); for (int i = 1; i <= n; ++i) { if (vec[i - 1] > 0) { max_idx[i] = i - 1; } else { max_idx[i] = max_idx[i - 1]; } } // 找到所有满足 prefix_sum[i] == target 的位置(左端点) vector<int> left; for (int i = 1; i <= n; ++i) { if (prefix_sum[i] == target) { left.push_back(i); } } // 找到所有满足 prefix_sum[j] == 2 * target 的位置(右端点) vector<int> right; for (int j = 1; j <= n; ++j) { if (prefix_sum[j] == 2 * target) { right.push_back(j); } } // 统计满足条件的 (i, j) 对数 int sol = 0; int right_ptr = 0; // 指向 right 数组的指针 for (int i : left) { // 找到第一个 j > i 且 prefix_sum[j] == 2 * target while (right_ptr < right.size() && right[right_ptr] <= i) { right_ptr++; } // 遍历所有满足 j > i 的 j for (int j_idx = right_ptr; j_idx < right.size(); ++j_idx) { int j = right[j_idx]; // 检查 [0, j) 和 [i, j) 和 [j, n) 是否有正数 if (max_idx[i] >= 0 && max_idx[j] >= i && max_idx[n] >= j) { sol++; } } } cout << sol << endl; return 0; }