#include <bits/stdc++.h>
#define fi first
#define sc second
#define forn(i,p,k) for(int i=(p);i<=(k);++i)
#define pb push_back
#define mp make_pair
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MM = 300013;
const int P = 1000000007;
struct NN {
int sum[2];
NN * L, * R;
NN() {sum[0] = 0, sum[1] = 0, L = nullptr, R = nullptr;}
} Node[MM * 30];
int dp[MM];
int IND = 0;
inline NN * getNew() {
return Node + IND++;
}
inline int add(const int &a, const int &b) {
return a + b >= P ? a + b - P : a + b;
}
void Update(NN * N, int p, int k, const int &ind, const int &v) {
if (p == k) {
N->sum[p&1] = add(N->sum[p&1], v);
return;
}
int mid = (p+k) >> 1;
if (ind <= mid) {
if (N->L == nullptr) N->L = getNew();
Update(N->L,p,mid,ind,v);
}
else {
if (N->R == nullptr) N->R = getNew();
Update(N->R,mid+1,k,ind,v);
}
N->sum[0] = 0;
N->sum[1] = 0;
if (N->L != nullptr) N->sum[0] = add(N->sum[0], N->L->sum[0]), N->sum[1] = add(N->sum[1], N->L->sum[1]);
if (N->R != nullptr) N->sum[0] = add(N->sum[0], N->R->sum[0]), N->sum[1] = add(N->sum[1], N->R->sum[1]);
}
int Query(NN * N, int p, int k, int l, int r, int par) {
if(p > r || k < l) return 0;
if(l<=p&&k<=r) return N->sum[par];
int mid = (p+k)>>1;
int res = 0;
if (N->L != nullptr) res = add(res, Query(N->L,p,mid,l,r,par));
if (N->R != nullptr) res = add(res, Query(N->R,mid+1,k,l,r,par));
return res;
}
int main()
{
ios_base::sync_with_stdio(0);
cin.tie(0);
NN * root = getNew();
int n;
cin>>n;
Update(root,0,P-1,0,1);
dp[0] = 1;
forn(i,1,n) cin>>dp[i];
int sum = 0;
forn(i,1,n) {
sum = add(sum, dp[i]);
dp[i] = 0;
dp[i] = add(dp[i], Query(root, 0, P-1, 0, sum, sum&1));
if (sum != P-1) dp[i] = add(dp[i], Query(root, 0, P-1 , sum+1, P-1, (sum&1)^1));
Update(root,0,P-1,sum,dp[i]);
}
cout<<dp[n]<<"\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 | #include <bits/stdc++.h> #define fi first #define sc second #define forn(i,p,k) for(int i=(p);i<=(k);++i) #define pb push_back #define mp make_pair using namespace std; typedef long long ll; typedef pair<int,int> pii; const int MM = 300013; const int P = 1000000007; struct NN { int sum[2]; NN * L, * R; NN() {sum[0] = 0, sum[1] = 0, L = nullptr, R = nullptr;} } Node[MM * 30]; int dp[MM]; int IND = 0; inline NN * getNew() { return Node + IND++; } inline int add(const int &a, const int &b) { return a + b >= P ? a + b - P : a + b; } void Update(NN * N, int p, int k, const int &ind, const int &v) { if (p == k) { N->sum[p&1] = add(N->sum[p&1], v); return; } int mid = (p+k) >> 1; if (ind <= mid) { if (N->L == nullptr) N->L = getNew(); Update(N->L,p,mid,ind,v); } else { if (N->R == nullptr) N->R = getNew(); Update(N->R,mid+1,k,ind,v); } N->sum[0] = 0; N->sum[1] = 0; if (N->L != nullptr) N->sum[0] = add(N->sum[0], N->L->sum[0]), N->sum[1] = add(N->sum[1], N->L->sum[1]); if (N->R != nullptr) N->sum[0] = add(N->sum[0], N->R->sum[0]), N->sum[1] = add(N->sum[1], N->R->sum[1]); } int Query(NN * N, int p, int k, int l, int r, int par) { if(p > r || k < l) return 0; if(l<=p&&k<=r) return N->sum[par]; int mid = (p+k)>>1; int res = 0; if (N->L != nullptr) res = add(res, Query(N->L,p,mid,l,r,par)); if (N->R != nullptr) res = add(res, Query(N->R,mid+1,k,l,r,par)); return res; } int main() { ios_base::sync_with_stdio(0); cin.tie(0); NN * root = getNew(); int n; cin>>n; Update(root,0,P-1,0,1); dp[0] = 1; forn(i,1,n) cin>>dp[i]; int sum = 0; forn(i,1,n) { sum = add(sum, dp[i]); dp[i] = 0; dp[i] = add(dp[i], Query(root, 0, P-1, 0, sum, sum&1)); if (sum != P-1) dp[i] = add(dp[i], Query(root, 0, P-1 , sum+1, P-1, (sum&1)^1)); Update(root,0,P-1,sum,dp[i]); } cout<<dp[n]<<"\n"; return 0; } |
English