#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
const int MOD = 1e9 + 7;
struct dp{
vector<pair<int,int>> synowie;
vector<pair<int,int>> t;
int pd = 1;
void init(int n){
t.push_back({0,0});
synowie.push_back({0,0});
while(pd < n)
pd *= 2;
}
int as(int i,int k){
if(k == 0){
if(synowie[i].F != 0)
return synowie[i].F;
synowie.push_back({0,0});
t.push_back({0,0});
return synowie[i].F = t.size() - 1;
}
if(k == 1){
if(synowie[i].S != 0)
return synowie[i].S;
synowie.push_back({0,0});
t.push_back({0,0});
return synowie[i].S = t.size() - 1;
}
}
void add(int a,int b,int p,int k,int i,int x){
if(k < a || b < p)
return;
if(a <= p && k <= b){
t[i].F += x;
t[i].F %= MOD;
return;
}
int s = (p + k)/2;
add(a,b,p,s,as(i,0),x);
add(a,b,s+1,k,as(i,1),x);
t[i].S = ((t[as(i,0)].F + t[as(i,0)].S)%MOD + (t[as(i,1)].F + t[as(i,1)].S)%MOD) % MOD;
}
int spr(int p,int k,int i,int S,int l,int SUMA){
if((((min(p-1,MOD/2)*2+l+S)%MOD)%2 == 1 && ((min(k-1,MOD/2)*2+l+S)%MOD)%2 == 1) || p > MOD)
return 0;
if(((min(p-1,MOD/2)*2+l+S)%MOD)%2 == 0 && ((min(k-1,MOD/2)*2+l+S)%MOD)%2 == 0){
return ((t[i].F + t[i].S) % MOD + SUMA) % MOD;
}
int s = (p + k)/2;
SUMA += t[i].F;
SUMA %= MOD;
return (spr(p,s,as(i,0),S,l,SUMA) + spr(s+1,k,as(i,1),S,l,SUMA)) % MOD;
}
} tab[2];
void dodaj(int i,int x){
i = (i + MOD) % MOD;
tab[i%2].add(i/2 + 1, i/2 + 1, 1, tab[i%2].pd, 0, x);
}
int licz(int S){
int wynik = 0;
for(int i=0; i<2; i++){
wynik += tab[i%2].spr(1,tab[i%2].pd, 0, S, (i%2),0);
}
return wynik%MOD;
}
int main(){
tab[0].init((MOD+9)/2);
tab[1].init((MOD+9)/2);
int n;
cin >> n;
int S = 0;
int wynik;
dodaj(MOD,1);
for(int i=0,a; i<n; i++){
wynik = 0;
cin >> a;
wynik = licz((S + a)% MOD);
dodaj((-S-a)%MOD, wynik);
S += a;
S %= MOD;
}
cout << wynik << "\n";
}
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 | #include <bits/stdc++.h> using namespace std; #define F first #define S second const int MOD = 1e9 + 7; struct dp{ vector<pair<int,int>> synowie; vector<pair<int,int>> t; int pd = 1; void init(int n){ t.push_back({0,0}); synowie.push_back({0,0}); while(pd < n) pd *= 2; } int as(int i,int k){ if(k == 0){ if(synowie[i].F != 0) return synowie[i].F; synowie.push_back({0,0}); t.push_back({0,0}); return synowie[i].F = t.size() - 1; } if(k == 1){ if(synowie[i].S != 0) return synowie[i].S; synowie.push_back({0,0}); t.push_back({0,0}); return synowie[i].S = t.size() - 1; } } void add(int a,int b,int p,int k,int i,int x){ if(k < a || b < p) return; if(a <= p && k <= b){ t[i].F += x; t[i].F %= MOD; return; } int s = (p + k)/2; add(a,b,p,s,as(i,0),x); add(a,b,s+1,k,as(i,1),x); t[i].S = ((t[as(i,0)].F + t[as(i,0)].S)%MOD + (t[as(i,1)].F + t[as(i,1)].S)%MOD) % MOD; } int spr(int p,int k,int i,int S,int l,int SUMA){ if((((min(p-1,MOD/2)*2+l+S)%MOD)%2 == 1 && ((min(k-1,MOD/2)*2+l+S)%MOD)%2 == 1) || p > MOD) return 0; if(((min(p-1,MOD/2)*2+l+S)%MOD)%2 == 0 && ((min(k-1,MOD/2)*2+l+S)%MOD)%2 == 0){ return ((t[i].F + t[i].S) % MOD + SUMA) % MOD; } int s = (p + k)/2; SUMA += t[i].F; SUMA %= MOD; return (spr(p,s,as(i,0),S,l,SUMA) + spr(s+1,k,as(i,1),S,l,SUMA)) % MOD; } } tab[2]; void dodaj(int i,int x){ i = (i + MOD) % MOD; tab[i%2].add(i/2 + 1, i/2 + 1, 1, tab[i%2].pd, 0, x); } int licz(int S){ int wynik = 0; for(int i=0; i<2; i++){ wynik += tab[i%2].spr(1,tab[i%2].pd, 0, S, (i%2),0); } return wynik%MOD; } int main(){ tab[0].init((MOD+9)/2); tab[1].init((MOD+9)/2); int n; cin >> n; int S = 0; int wynik; dodaj(MOD,1); for(int i=0,a; i<n; i++){ wynik = 0; cin >> a; wynik = licz((S + a)% MOD); dodaj((-S-a)%MOD, wynik); S += a; S %= MOD; } cout << wynik << "\n"; } |
English