[Codeforces 466C] Number of Ways
[题目链接]
https://codeforces.com/contest/466/problem/C
[算法]
维护序列前缀和 , 枚举中间一段即可 , 详见代码
时间复杂度 : O(N)
[代码]
#include<bits/stdc++.h> using namespace std; const int MAXN = 5e5 + 10; int a[MAXN]; long long sum[MAXN]; template <typename T> inline void read(T &x) { T f = 1; x = 0; char c = getchar(); for (; !isdigit(c); c = getchar()) if (c == '-') f = -f; for (; isdigit(c); c = getchar()) x = (x << 3) + (x << 1) + c - '0'; x *= f; } int main() { int n; read(n); for (int i = 1; i <= n; i++) { read(a[i]); sum[i] = sum[i - 1] + a[i]; } if (sum[n] % 3 != 0) { printf("0\n"); return 0; } long long value = sum[n] / 3 , ans = 0 , cnt = 0; for (int i = 1; i < n; i++) { if (sum[i] != 2 * value) { if (sum[i] == value) cnt++; continue; } ans += cnt; if (sum[i] == value) cnt++; } printf("%I64d\n",ans); return 0; }