//Autor: Bartłomiej Czarkowski #include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; const int N = 3e5 + 7; struct node { int l, r, w[2]; }; int n, a, b, com; int dp[N]; vector<node> st; void ins(int x, int l, int r, int p, int w) { if (l == r) { st[x].w[l & 1] += w; if (st[x].w[l & 1] >= MOD) { st[x].w[l & 1] -= MOD; } return; } if (p <= (l + r) / 2) { if (!st[x].l) { st[x].l = st.size(); st.push_back({0, 0, {0, 0}}); } ins(st[x].l, l, (l + r) / 2, p, w); } else { if (!st[x].r) { st[x].r = st.size(); st.push_back({0, 0, {0, 0}}); } ins(st[x].r, (l + r) / 2 + 1, r, p, w); } st[x].w[0] = st[st[x].l].w[0] + st[st[x].r].w[0]; if (st[x].w[0] >= MOD) { st[x].w[0] -= MOD; } st[x].w[1] = st[st[x].l].w[1] + st[st[x].r].w[1]; if (st[x].w[1] >= MOD) { st[x].w[1] -= MOD; } } int zap(int x, int l, int r, int ll, int rr, int p) { if (l > rr || ll > r) { return 0; } if (ll <= l && r <= rr) { return st[x].w[p]; } int w = zap(st[x].l, l, (l + r) / 2, ll, rr, p) + zap(st[x].r, (l + r) / 2 + 1, r, ll, rr, p); if (w >= MOD) { w -= MOD; } return w; } int main() { com = 1; while (com < MOD) { com <<= 1; } st.push_back({0, 0, {0, 0}}); st.push_back({0, 0, {0, 0}}); ins(1, 0, com - 1, 0, 1); scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &a); b += a; if (b >= MOD) { b -= MOD; } dp[i] = zap(1, 0, com - 1, 0, b, b & 1) + zap(1, 0, com - 1, b + 1, com - 1, (b & 1) ^ 1); if (dp[i] >= MOD) { dp[i] -= MOD; } ins(1, 0, com - 1, b, dp[i]); } printf("%d\n", dp[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 | //Autor: Bartłomiej Czarkowski #include <bits/stdc++.h> using namespace std; const int MOD = 1e9 + 7; const int N = 3e5 + 7; struct node { int l, r, w[2]; }; int n, a, b, com; int dp[N]; vector<node> st; void ins(int x, int l, int r, int p, int w) { if (l == r) { st[x].w[l & 1] += w; if (st[x].w[l & 1] >= MOD) { st[x].w[l & 1] -= MOD; } return; } if (p <= (l + r) / 2) { if (!st[x].l) { st[x].l = st.size(); st.push_back({0, 0, {0, 0}}); } ins(st[x].l, l, (l + r) / 2, p, w); } else { if (!st[x].r) { st[x].r = st.size(); st.push_back({0, 0, {0, 0}}); } ins(st[x].r, (l + r) / 2 + 1, r, p, w); } st[x].w[0] = st[st[x].l].w[0] + st[st[x].r].w[0]; if (st[x].w[0] >= MOD) { st[x].w[0] -= MOD; } st[x].w[1] = st[st[x].l].w[1] + st[st[x].r].w[1]; if (st[x].w[1] >= MOD) { st[x].w[1] -= MOD; } } int zap(int x, int l, int r, int ll, int rr, int p) { if (l > rr || ll > r) { return 0; } if (ll <= l && r <= rr) { return st[x].w[p]; } int w = zap(st[x].l, l, (l + r) / 2, ll, rr, p) + zap(st[x].r, (l + r) / 2 + 1, r, ll, rr, p); if (w >= MOD) { w -= MOD; } return w; } int main() { com = 1; while (com < MOD) { com <<= 1; } st.push_back({0, 0, {0, 0}}); st.push_back({0, 0, {0, 0}}); ins(1, 0, com - 1, 0, 1); scanf("%d", &n); for (int i = 1; i <= n; ++i) { scanf("%d", &a); b += a; if (b >= MOD) { b -= MOD; } dp[i] = zap(1, 0, com - 1, 0, b, b & 1) + zap(1, 0, com - 1, b + 1, com - 1, (b & 1) ^ 1); if (dp[i] >= MOD) { dp[i] -= MOD; } ins(1, 0, com - 1, b, dp[i]); } printf("%d\n", dp[n]); return 0; } |