#include <iostream> #include <vector> using namespace std; int main() { int n; cin >> n; vector<long long> a(n); for (int i = 0; i < n; i++) { cin >> a[i]; } // 计算整个数组的和 long long total_sum = 0; for (int i = 0; i < n; i++) { total_sum += a[i]; } // 如果总和不能被3整除,则无解 if (total_sum % 3 != 0) { cout << 0 << endl; return 0; } long long target_sum = total_sum / 3; int count = 0; // 预处理:计算前缀和和有正数的区间 vector<long long> prefix_sum(n + 1, 0); vector<bool> prefix_has_positive(n + 1, false); for (int i = 0; i < n; i++) { prefix_sum[i + 1] = prefix_sum[i] + a[i]; prefix_has_positive[i + 1] = prefix_has_positive[i] || (a[i] > 0); } // 预处理:计算后缀是否有正数 vector<bool> suffix_has_positive(n + 1, false); for (int i = n - 1; i >= 0; i--) { suffix_has_positive[i] = suffix_has_positive[i + 1] || (a[i] > 0); } // 枚举两个切点 for (int i = 0; i < n - 2; i++) { // 第一个子数组 [0...i] long long sum1 = prefix_sum[i + 1]; bool has_positive1 = prefix_has_positive[i + 1]; if (sum1 != target_sum || !has_positive1) { continue; } for (int j = i + 1; j < n - 1; j++) { // 第二个子数组 [i+1...j] long long sum2 = prefix_sum[j + 1] - prefix_sum[i + 1]; // 检查第二个子数组是否有正数 bool has_positive2 = false; for (int k = i + 1; k <= j; k++) { if (a[k] > 0) { has_positive2 = true; break; } } if (sum2 != target_sum || !has_positive2) { continue; } // 第三个子数组 [j+1...n-1] long long sum3 = prefix_sum[n] - prefix_sum[j + 1]; bool has_positive3 = suffix_has_positive[j + 1]; if (sum3 == target_sum && has_positive3) { count++; } } } cout << count << endl; return 0; }