#include <bits/stdc++.h> #define ll long long using namespace std; ll mod = 1e9+7; ll treeSize; ll pot(ll x){ ll tmp = 1; while(x){ x/=2; tmp*=2; } return tmp; } struct node{ node *l, *r; ll val; node(ll v){ val = v; l = nullptr; r = nullptr; } }; void update(ll a, ll v, node *pt, ll l=0, ll r = treeSize-1){ pt->val+=v; pt->val%=mod; if(l==r) return; ll mid = (l+r)/2; if(pt->l==nullptr) pt->l = new node(0); if(pt->r==nullptr) pt->r = new node(0); if(a<=mid) update(a, v, pt->l, l, mid); if(a>mid) update(a, v, pt->r, mid+1, r); } ll qur(ll a, ll b, node *pt, ll q=0, ll r=treeSize-1){ if(pt==nullptr) return 0; if(a==q&&b==r){ //cout<<a<<" "<<b<<" "<<pt->val<<'\n'; return pt->val; } ll mid = (q+r)/2; ll out = 0; if(a<=mid) out += qur(a, min(mid, b), pt->l, q, mid); if(b>mid) out += qur(max(a, mid+1), b, pt->r, mid+1, r); return out%mod; } int main(){ ios_base::sync_with_stdio(0); ll n; cin>>n; treeSize = pot(mod); node *odd = new node(0), *even = new node(0); update(0, 1, even); ll pref = 0; ll wyn = 0; for(ll i = 0; i < n; i++){ ll a; cin>>a; pref+=a; pref%=mod; ll tmp = 0; if(pref%2){ tmp+=qur(0, pref, odd); tmp+=qur(pref+1, mod, even); update(pref, tmp, odd); }else{ tmp+=qur(0, pref, even); //cout<<i<<" "<<tmp<<'\n'; tmp+=qur(pref+1, mod, odd); update(pref, tmp, even); } //cout<<tmp<<'\n'; if(i==n-1) wyn = tmp%mod; } cout<<wyn<<'\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 | #include <bits/stdc++.h> #define ll long long using namespace std; ll mod = 1e9+7; ll treeSize; ll pot(ll x){ ll tmp = 1; while(x){ x/=2; tmp*=2; } return tmp; } struct node{ node *l, *r; ll val; node(ll v){ val = v; l = nullptr; r = nullptr; } }; void update(ll a, ll v, node *pt, ll l=0, ll r = treeSize-1){ pt->val+=v; pt->val%=mod; if(l==r) return; ll mid = (l+r)/2; if(pt->l==nullptr) pt->l = new node(0); if(pt->r==nullptr) pt->r = new node(0); if(a<=mid) update(a, v, pt->l, l, mid); if(a>mid) update(a, v, pt->r, mid+1, r); } ll qur(ll a, ll b, node *pt, ll q=0, ll r=treeSize-1){ if(pt==nullptr) return 0; if(a==q&&b==r){ //cout<<a<<" "<<b<<" "<<pt->val<<'\n'; return pt->val; } ll mid = (q+r)/2; ll out = 0; if(a<=mid) out += qur(a, min(mid, b), pt->l, q, mid); if(b>mid) out += qur(max(a, mid+1), b, pt->r, mid+1, r); return out%mod; } int main(){ ios_base::sync_with_stdio(0); ll n; cin>>n; treeSize = pot(mod); node *odd = new node(0), *even = new node(0); update(0, 1, even); ll pref = 0; ll wyn = 0; for(ll i = 0; i < n; i++){ ll a; cin>>a; pref+=a; pref%=mod; ll tmp = 0; if(pref%2){ tmp+=qur(0, pref, odd); tmp+=qur(pref+1, mod, even); update(pref, tmp, odd); }else{ tmp+=qur(0, pref, even); //cout<<i<<" "<<tmp<<'\n'; tmp+=qur(pref+1, mod, odd); update(pref, tmp, even); } //cout<<tmp<<'\n'; if(i==n-1) wyn = tmp%mod; } cout<<wyn<<'\n'; return 0; } |