//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; } |
English