#include <bits/stdc++.h> using namespace std; long long mod=1000000007; struct d{ long long war; int ind; }; struct prze{ long long war,pp,kp; }; prze drze[2][1000000]; vector <d> pnp[2]; long long mn[2]; d sp[500001]; bool operator < (d a,d b){ if(a.war<b.war) return 1; return 0; } void setup(int wierz,int parz){ if(wierz<mn[parz]){ setup(wierz*2,parz); setup(wierz*2+1,parz); }else{ drze[parz][wierz].pp=pnp[parz][wierz-mn[parz]].war; drze[parz][wierz].kp=pnp[parz][wierz-mn[parz]].war; return; } drze[parz][wierz*2].pp=drze[parz][wierz*2].pp; drze[parz][wierz*2+1].kp=drze[parz][wierz*2+1].kp; } void dod(int pocz,int kon,int wierz,int parz,int war){ if((drze[parz][wierz].pp>=pocz)and(drze[parz][wierz].kp>=kon)){ drze[parz][wierz].war+=war; drze[parz][wierz].war%=mod; return; } if((drze[parz][wierz].kp<pocz)or(drze[parz][wierz].pp>kon)) return; if(wierz>=mn[parz]) return; dod(pocz,kon,wierz*2,parz,war); dod(pocz,kon,wierz*2+1,parz,war); } int que(int wierz,int parz){ if(wierz>1) return (drze[parz][wierz].war+que(wierz/2,parz))%mod; return drze[parz][wierz].war; } long long n,wyn,ps,pocz,kon; long long t[500001]; long long g[500001]; int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++){ scanf("%lld",&t[i]); sp[i].war=(sp[i-1].war+t[i])%mod; sp[i].war%=mod; sp[i].ind=i; pnp[sp[i].war%2].push_back(sp[i]); } sort(pnp[0].begin(),pnp[0].end()); sort(pnp[1].begin(),pnp[1].end()); for(int i=0;i<pnp[0].size();i++) g[pnp[0][i].ind]=i; for(int i=0;i<pnp[1].size();i++) g[pnp[1][i].ind]=i; mn[0]=1; mn[1]=1; while(mn[0]<pnp[0].size()) mn[0]*=2; while(mn[1]<pnp[1].size()) mn[1]*=2; setup(1,0); setup(1,1); for(int i=1;i<=n;i++){ if(i==1) wyn=1; else{ wyn=que(mn[(t[i-1]%2)]+g[i-1],t[i-1]%2); } ps=sp[i-1].war; //if(t[i]%2==0){ pocz=(mod-ps)%mod; kon=mod-ps-t[i]-1; /*}else{ pocz=mod-ps-t[i]; kon=mod-ps; }*/ if(pocz<0) pocz+=mod; if(kon<0) kon+=mod; //printf("%d %d %d %d %d\n",i,wyn,pocz,kon,ps); if(pocz<kon){ dod(pocz,kon,1,t[i]%2,wyn); dod(0,pocz-1,1,(t[i]%2) ^ 1,wyn); dod(kon+1,mod,1,(t[i]%2) ^ 1,wyn); }else{ dod(0,kon,1,t[i]%2,wyn); dod(pocz,mod,1,t[i]%2,wyn); dod(kon+1,pocz-1,1,(t[i]%2) ^ 1,wyn); } if(t[i]%2==0) dod(t[i],t[i],1,t[i]%2,wyn); } wyn=que(mn[t[n]%2]+g[n],t[n]%2); printf("%lld",wyn); 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 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 | #include <bits/stdc++.h> using namespace std; long long mod=1000000007; struct d{ long long war; int ind; }; struct prze{ long long war,pp,kp; }; prze drze[2][1000000]; vector <d> pnp[2]; long long mn[2]; d sp[500001]; bool operator < (d a,d b){ if(a.war<b.war) return 1; return 0; } void setup(int wierz,int parz){ if(wierz<mn[parz]){ setup(wierz*2,parz); setup(wierz*2+1,parz); }else{ drze[parz][wierz].pp=pnp[parz][wierz-mn[parz]].war; drze[parz][wierz].kp=pnp[parz][wierz-mn[parz]].war; return; } drze[parz][wierz*2].pp=drze[parz][wierz*2].pp; drze[parz][wierz*2+1].kp=drze[parz][wierz*2+1].kp; } void dod(int pocz,int kon,int wierz,int parz,int war){ if((drze[parz][wierz].pp>=pocz)and(drze[parz][wierz].kp>=kon)){ drze[parz][wierz].war+=war; drze[parz][wierz].war%=mod; return; } if((drze[parz][wierz].kp<pocz)or(drze[parz][wierz].pp>kon)) return; if(wierz>=mn[parz]) return; dod(pocz,kon,wierz*2,parz,war); dod(pocz,kon,wierz*2+1,parz,war); } int que(int wierz,int parz){ if(wierz>1) return (drze[parz][wierz].war+que(wierz/2,parz))%mod; return drze[parz][wierz].war; } long long n,wyn,ps,pocz,kon; long long t[500001]; long long g[500001]; int main(){ scanf("%lld",&n); for(int i=1;i<=n;i++){ scanf("%lld",&t[i]); sp[i].war=(sp[i-1].war+t[i])%mod; sp[i].war%=mod; sp[i].ind=i; pnp[sp[i].war%2].push_back(sp[i]); } sort(pnp[0].begin(),pnp[0].end()); sort(pnp[1].begin(),pnp[1].end()); for(int i=0;i<pnp[0].size();i++) g[pnp[0][i].ind]=i; for(int i=0;i<pnp[1].size();i++) g[pnp[1][i].ind]=i; mn[0]=1; mn[1]=1; while(mn[0]<pnp[0].size()) mn[0]*=2; while(mn[1]<pnp[1].size()) mn[1]*=2; setup(1,0); setup(1,1); for(int i=1;i<=n;i++){ if(i==1) wyn=1; else{ wyn=que(mn[(t[i-1]%2)]+g[i-1],t[i-1]%2); } ps=sp[i-1].war; //if(t[i]%2==0){ pocz=(mod-ps)%mod; kon=mod-ps-t[i]-1; /*}else{ pocz=mod-ps-t[i]; kon=mod-ps; }*/ if(pocz<0) pocz+=mod; if(kon<0) kon+=mod; //printf("%d %d %d %d %d\n",i,wyn,pocz,kon,ps); if(pocz<kon){ dod(pocz,kon,1,t[i]%2,wyn); dod(0,pocz-1,1,(t[i]%2) ^ 1,wyn); dod(kon+1,mod,1,(t[i]%2) ^ 1,wyn); }else{ dod(0,kon,1,t[i]%2,wyn); dod(pocz,mod,1,t[i]%2,wyn); dod(kon+1,pocz-1,1,(t[i]%2) ^ 1,wyn); } if(t[i]%2==0) dod(t[i],t[i],1,t[i]%2,wyn); } wyn=que(mn[t[n]%2]+g[n],t[n]%2); printf("%lld",wyn); return 0; } |