#include <bits/stdc++.h>
using namespace std;
template <class T, class S>
ostream& operator<<(ostream& os, const pair<T, S>& v) {
  return os << "(" << v.first << ", " << v.second << ")";
}
template <class T>
ostream& operator<<(ostream& os, const vector<T>& v) {
  os << "[";
  for (int i = int(0); i <= int((static_cast<int>((v).size())) - 1); ++i) {
    if (i) os << ", ";
    os << v[i];
  }
  return os << "]";
}
template <class T>
bool setmax(T& _a, T _b) {
  if (_a < _b) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
bool setmin(T& _a, T _b) {
  if (_b < _a) {
    _a = _b;
    return true;
  }
  return false;
}
template <class T>
T gcd(T _a, T _b) {
  return _b == 0 ? _a : gcd(_b, _a % _b);
}
const int N = 300010;
int a1[N], a2[N], a[N];
int p1[N], p2[N], p[N];
int n;
void prepare(int va[], int vp[]) {
  long long cur = 0;
  unordered_map<long long, int> m;
  for (int i = int(n); i >= int(1); --i) {
    m[cur] = i;
    cur += va[i];
    if (m.count(cur)) {
      vp[i] = m[cur];
    } else {
      vp[i] = n + 1;
    }
    if (i < n) setmin(vp[i], vp[i + 1]);
  }
}
int f[N], fp1[N], fp2[N];
void update(int i, int j, int val) {
  if (i > n || j > n) return;
  if (i == j) {
    if (setmax(f[i], val)) {
      fp1[i] = fp2[i] = n + 1;
    }
  } else {
    if (i < j) {
      if (setmax(f[i], val - 1)) {
        fp1[i] = fp2[i] = n + 1;
      }
      if (f[i] == val - 1) {
        setmin(fp2[i], j);
      }
    } else {
      if (setmax(f[j], val - 1)) {
        fp1[j] = fp2[j] = n + 1;
      }
      if (f[j] == val - 1) {
        setmin(fp1[j], i);
      }
    }
  }
}
int main() {
  scanf("%d", &n);
  for (int i = int(1); i <= int(n); ++i) scanf("%d", &a1[i]);
  for (int i = int(1); i <= int(n); ++i) scanf("%d", &a2[i]);
  for (int i = int(1); i <= int(n); ++i) a[i] = a1[i] + a2[i];
  prepare(a1, p1);
  prepare(a2, p2);
  prepare(a, p);
  memset(f, -1, sizeof(f));
  update(0, 0, 0);
  for (int i = int(0); i <= int(n - 1); ++i) {
    update(i + 1, i + 1, f[i]);
    update(p[i + 1], p[i + 1], f[i] + 1);
    update(p1[i + 1], i, f[i] + 1);
    update(i, p2[i + 1], f[i] + 1);
    update(fp1[i], fp1[i], f[i] + 1);
    update(fp1[i], p2[i + 1], f[i] + 2);
    update(fp2[i], fp2[i], f[i] + 1);
    update(p1[i + 1], fp2[i], f[i] + 2);
  }
  printf("%d\n", f[n]);
  return 0;
}
