#include <bits/stdc++.h> using namespace std; using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template<class A, class B> auto& operator<<(ostream &o, pair<A, B> p) { return o << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for(auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } ostream& operator<<(ostream &o, string &s) { return o << s.data(); } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n' #else #define debug(...) {} #endif constexpr int mod = (int) (1e9 + 7); struct Tree { int pwr = 1; vector<int> t; Tree(int n) { while (pwr < n) pwr *= 2; t.resize(2 * pwr); } void add(int v, int val) { v += pwr - 1; while (v) { t[v] += val; t[v] %= mod; v /= 2; } } int sum(int v, int x, int y, int l, int r) { if (y < l || x > r) return 0; if (x >= l && y <= r) return t[v]; return (sum(v * 2, x, (x + y) / 2, l, r) + sum(v * 2 + 1, (x + y) / 2 + 1, y, l, r)) % mod; } int sum(int l, int r) { return sum(1, 1, pwr, l, r); } }; int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<int> a(n + 1), pref(n + 1); map<int, int> sc; sc[0] = 0; FOR(i, 1, n) { cin >> a[i]; pref[i] = (pref[i - 1] + a[i]) % mod; sc[pref[i]] = 0; } int cnt = 0; for (auto &[a, b] : sc) b = ++cnt; int m = ssize(sc); Tree even(m), odd(m); even.add(1, 1); int x, ans = 1; FOR(i, 1, n) { x = sc[pref[i]]; if (pref[i] % 2 == 0) { ans = (even.sum(1, x) + odd.sum(x + 1, m)) % mod; even.add(x, ans); } else { ans = (odd.sum(1, x) + even.sum(x + 1, m)) % mod; odd.add(x, ans); } } cout << ans << '\n'; return 0; }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | #include <bits/stdc++.h> using namespace std; using LL = long long; #define FOR(i, l, r) for(int i = (l); i <= (r); ++i) #define REP(i, n) FOR(i, 0, (n) - 1) #define ssize(x) int(x.size()) template<class A, class B> auto& operator<<(ostream &o, pair<A, B> p) { return o << '(' << p.first << ", " << p.second << ')'; } template<class T> auto operator<<(ostream &o, T x) -> decltype(x.end(), o) { o << '{'; int i = 0; for(auto e : x) o << (", ")+2*!i++ << e; return o << '}'; } ostream& operator<<(ostream &o, string &s) { return o << s.data(); } #ifdef DEBUG #define debug(x...) cerr << "[" #x "]: ", [](auto... $) {((cerr << $ << "; "), ...); }(x), cerr << '\n' #else #define debug(...) {} #endif constexpr int mod = (int) (1e9 + 7); struct Tree { int pwr = 1; vector<int> t; Tree(int n) { while (pwr < n) pwr *= 2; t.resize(2 * pwr); } void add(int v, int val) { v += pwr - 1; while (v) { t[v] += val; t[v] %= mod; v /= 2; } } int sum(int v, int x, int y, int l, int r) { if (y < l || x > r) return 0; if (x >= l && y <= r) return t[v]; return (sum(v * 2, x, (x + y) / 2, l, r) + sum(v * 2 + 1, (x + y) / 2 + 1, y, l, r)) % mod; } int sum(int l, int r) { return sum(1, 1, pwr, l, r); } }; int main() { cin.tie(0)->sync_with_stdio(0); int n; cin >> n; vector<int> a(n + 1), pref(n + 1); map<int, int> sc; sc[0] = 0; FOR(i, 1, n) { cin >> a[i]; pref[i] = (pref[i - 1] + a[i]) % mod; sc[pref[i]] = 0; } int cnt = 0; for (auto &[a, b] : sc) b = ++cnt; int m = ssize(sc); Tree even(m), odd(m); even.add(1, 1); int x, ans = 1; FOR(i, 1, n) { x = sc[pref[i]]; if (pref[i] % 2 == 0) { ans = (even.sum(1, x) + odd.sum(x + 1, m)) % mod; even.add(x, ans); } else { ans = (odd.sum(1, x) + even.sum(x + 1, m)) % mod; odd.add(x, ans); } } cout << ans << '\n'; return 0; } |