#include <bits/stdc++.h>
using namespace std;
#define endl '\n'
#define FRR(file) freopen(file,"r",stdin)
#define FRW(file) freopen(file,"w",stdout)
#define TIMESTAMP cerr<<fixed<<setprecision(3)<<clock()*1.0/CLOCKS_PER_SEC<<"s"<<endl;
#define _rep(i,a,b) for (int i=(a);i<=(b);++i)
#define _reps(i,a,b,c) for (int i=(a);i<=(b);c)
#define _rrep(i,a,b) for (int i=(a);i>=(b);--i)
#define _rreps(i,a,b,c) for (int i=(a);i>=(b);c)
#define _iter(i,a) for (auto i=a.begin();i!=a.end();++i)
#define _graph(i,u) for (int i=h[u];~i;i=ne[i])
#define rint register int
#define LL long long
#define i32 signed
#define i64 long long
#define i128 __int128
#define u32 unsigned
#define u64 unsigned long long
typedef pair<int,int> pii;
typedef pair<int,pii> piii;
typedef pair<double,double> pdd;
namespace IO {
template<typename T> inline void read(T& x) {
int s=1; char c=getchar(); x=0;
while (!isdigit(c)) { if (c=='-') s=-1; c=getchar(); }
while (isdigit(c)) x=x*10+(c-'0'),c=getchar();
x*=s;
}
inline void readstr(string& x) {
x.clear(); char c=getchar();
while (isspace(c)) c=getchar();
while (!isspace(c)) x.push_back(c),c=getchar();
}
inline void readstr(char* x) {
int idx=0; char c=getchar();
while (isspace(c)) c=getchar();
while (!isspace(c)) x[idx++]=c,c=getchar();
x[idx]='\0';
}
template<typename T> inline void write(T x) {
if (x<0) putchar('-'),x=-x;
if (x/10) write(x/10);
putchar('0'+(x%10));
}
template<typename T> inline void writesp(T x) { write(x); putchar(' '); }
template<typename T> inline void writeln(T x) { write(x); putchar(10); }
inline void writestr(string& x) { _iter(it,x) putchar(*it); }
inline void writestr(char* x) { _rep(i,0,strlen(x)) putchar(x[i]); }
inline void writestrsp(string& x) { _iter(it,x) putchar(*it); putchar(' '); }
inline void writestrsp(char* x) { _rep(i,0,strlen(x)) putchar(x[i]); putchar(' '); }
inline void writestrln(string& x) { _iter(it,x) putchar(*it); putchar(10); }
inline void writestrln(char* x) { _rep(i,0,strlen(x)) putchar(x[i]); putchar(10); }
};
using namespace IO;
const int N=500005;
const int inf=1e9;
int n;
int a[N],k[N];
vector<int> L[N];
struct Seg {
int l,r;
int min;
} tr[2][N<<2]; // 0: left, 1: right
void pushup(Seg* tr,int u) {
tr[u].min=min(tr[u<<1].min,tr[u<<1|1].min);
}
void build(Seg* tr,int u,int l,int r) {
tr[u]={l,r,l?inf:0};
if (l==r) return;
int mid=l+r>>1;
build(tr,u<<1,l,mid); build(tr,u<<1|1,mid+1,r);
pushup(tr,u);
}
void modify(Seg* tr,int u,int p,int k) {
if (tr[u].l==p && tr[u].r==p) tr[u].min=k;
else {
int mid=tr[u].l+tr[u].r>>1;
if (p<=mid) modify(tr,u<<1,p,k);
else modify(tr,u<<1|1,p,k);
pushup(tr,u);
}
}
int query(Seg* tr,int u,int l,int r) {
if (tr[u].l>=l && tr[u].r<=r) return tr[u].min;
int mid=tr[u].l+tr[u].r>>1;
int ans=inf;
if (l<=mid) ans=min(ans,query(tr,u<<1,l,r));
if (r>mid) ans=min(ans,query(tr,u<<1|1,l,r));
return ans;
}
int main() {
read(n);
_rep(i,1,n) read(a[i]),assert(a[i]);
_rep(i,1,n) read(k[i]);
_rep(i,1,n) L[min(i+a[i]-1,n)].emplace_back(i);
build(tr[0],1,0,n);
build(tr[1],1,0,n);
_rep(i,1,n) {
int l=max(i-a[i]+1,1),r=i;
// 0: left
int lasLeft=query(tr[0],1,l-1,r-1);
int lasRight=query(tr[1],1,l-1,r-1);
int g=min(lasLeft,lasRight);
g++;
modify(tr[0],1,i,g);
// 1: right
g=inf;
while (!L[i].empty()) {
l=L[i].back(); L[i].pop_back();
lasLeft=query(tr[0],1,l-1,l-1);
lasRight=query(tr[1],1,l-1,r-1);
g=min(g,min(lasLeft,lasRight));
}
if (g==inf) continue;
g++;
modify(tr[1],1,i,g);
}
int ansa=query(tr[0],1,n,n);
int ansb=query(tr[1],1,n,n);
int ans=min(ansa,ansb);
write(ans);
return 0;
}
WA 了第 40 个点,痛失 20pts,所以错哪了捏