#include using namespace std; using ll = long long; template istream& operator >> (istream& is, vector& vec) { for(T& x : vec) is >> x; return is; } template ostream& operator << (ostream& os, const vector& vec) { if(vec.empty()) return os; os << vec[0]; for(auto it = vec.begin(); ++it != vec.end(); ) os << ' ' << *it; return os; } /* 考察 00ではない区間をいい感じに忘れ去れる問題 01,10の区間で0の方 11の区間ならどちらでも可能 11の区間をどう使うかがミソ -> 2乗なので隣接のうち大きい方に付ければ良さそう */ int main(){ ios::sync_with_stdio(false); cin.tie(0); int n, m; cin >> n; vector w(n); cin >> w >> m; vector s(m); cin >> s; vector ca; ca.reserve(n + m); w.insert(w.begin(), 0); for(int i = 0; i < n; i++)w[i + 1] += w[i]; ca.insert(ca.end(), w.begin(), w.end()); s.insert(s.begin(), 0); for(int i = 0; i < m; i++) s[i + 1] += s[i]; ca.insert(ca.end(), s.begin(), s.end()); sort(ca.begin(), ca.end()); ca.erase(unique(ca.begin(), ca.end()), ca.end()); int S = 0; vector> b; for(int i = 0, wi = 0, si = 0; i + 1 < ca.size(); i++){ int dt = ca[i + 1] - ca[i]; while(wi <= n && ca[i] == w[wi]){ wi++; S ^= 1; } while(si <= m && ca[i] == s[si]){ si++; S ^= 2; } b.emplace_back(dt, S); } for(int i = 0; i < b.size(); i++){ if(b[i].second != 3) continue; int lcnt = 0, rcnt = 0; if(i >= 1 && b[i - 1].second >= 1){ lcnt = b[i - 1].first + b[i].first; } if(i + 1 < b.size() && b[i + 1].second >= 1){ rcnt = b[i + 1].first + b[i].first; } if(lcnt == 0 && rcnt == 0) continue; // 01 11 01 11 // のときにどっちに付けて良いか分からなくないか... b[i].first = 0; if(lcnt > rcnt){ b[i - 1].first = lcnt; }else{ b[i + 1].first = rcnt; } } ll ans = 0; for(auto &&[cnt, S] : b){ if(S == 0) continue; ans += cnt * (ll)(cnt); } cout << ans << '\n'; }