第一行输入两个整数
代表数组中的元素数量。
第二行输入
个整数
代表数组元素。
在一行上输出一个整数,代表切分方案数。
3 3 3 3
1
6 1 1 4 5 1 4
0
10 0 3 4 2 3 2 1 -1 3 4
2
#include <stdio.h>
int main() {
int n = 0;
scanf("%d", &n);
int a[200000] = {0};
int sum = 0;
int s[200000] = {0};//前缀和
int d1[200000] = {0};//1/3位置
int d2[200000] = {0};//2/3位置
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
sum += a[i];
s[i] = sum;
}
int result = 0;
if (sum != 0) {
if (sum % 3 == 0) {
int cnt1 = 0;
int cnt2 = 0;
for (int i = 0; i < n ; i++) {
if (s[i] == sum / 3) {
int flag = 0;//前1/3有正数
for (int j = 0; j <= i; j++) {
if (a[j] > 0) {
flag = 1;
break;
}
}
if (flag) {
d1[cnt1++] = i;
flag = 0;
}
}
}
for (int i = n - 1; i >= 0 ; i--) {
if (s[i] == 2 * sum / 3) {
int flag = 0;//后1/3有正数
for (int j = n - 1; j >= i; j--) {
if (a[j] > 0) {
flag = 1;
break;
}
}
if (flag) {
d2[cnt2++] = i;
flag = 0;
}
}
}
//结果
for (int i = 0; i < cnt1; i++) {
for (int j = 0; j < cnt2; j++) {
if (d2[j] > d1[i]) {
//中间1/3有正数
int flag = 0;
for (int k = d1[i]; k <= d2[j]; k++) {
if (a[k] > 0) {
flag = 1;
break;
}
}
if (flag) {
result++;
flag = 0;
}
}
}
}
}
}
// else if (sum == 0) {
// int cnt = 0;
// for (int i = 0; i < n ; i++) {
// if (s[i] == 0) cnt++;
// }
// cnt--;
// result = cnt * (cnt - 1) / 2;
// }
printf("%d", result);
return 0;
}