import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Scanner; public class HJ98 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); while (sc.hasNextLine()) { int n = sc.nextInt(); int[] arr = new int[n]; for (int i = 0; i < n; i++) { arr[i] = sc.nextInt(); } System.out.println(f3(arr)); } } private static int f3(int[] arr) { // 求和,无法整除3则不符合要求 int sum = Arrays.stream(arr).sum(); if (sum % 3 != 0) { return 0; } // 从左边遍历,记录能求和得到 sum/3的下标 int sum1 = 0; boolean hasPosInt1 = false; List<Integer> indexList1 = new ArrayList<>(); for (int i = 0; i < arr.length; i++) { sum1 += arr[i]; hasPosInt1 = hasPosInt1 || arr[i] > 0; if (hasPosInt1 && sum1 == sum / 3) { indexList1.add(i); } } // 从右边遍历,记录能求和得到 sum/3的下标 int sum2 = 0; boolean hasPosInt2 = false; List<Integer> indexList2 = new ArrayList<>(); for (int i = arr.length - 1; i >= 0; i--) { sum2 += arr[i]; hasPosInt2 = hasPosInt2 || arr[i] > 0; if (hasPosInt2 && sum2 == sum / 3) { indexList2.add(i); } } // 遍历左下标 int count = 0; for (int i = 0; i < indexList1.size(); i++) { // 左下标 Integer index1 = indexList1.get(i); // 记录选中左下标时,右下标有多少种可选方案 int count1 = 0; // 遍历右下标 for (int j = 0; j < indexList2.size(); j++) { Integer index2 = indexList2.get(j); // 数组2是从大到小排序的,如果index2 <= index1,则后面的也是一样,可以直接break if (index2 <= index1) { break; } // index1 - index2之间的数据,排查是否有正数 boolean hasPosInt3 = false; for (int k = index1 + 1; k < index2; k++) { if ( arr[k] > 0) { hasPosInt3 = true; break; } } if (hasPosInt3) { count1 = j + 1; } } count += count1; } return count; } }