我们发现,如果我们打数字牌后,就不能打 0 了.
分两种情况讨论即可.
code:
#include <bits/stdc++.h>
#define N 200008
#define ll long long
#define setIO(s) freopen(s".in","r",stdin)
using namespace std;
int n;
int a[N],b[N];
set<int>se;
set<int>::iterator it;
int check()
{
int i,j,flag=0,cur,tp=1;
if(!b[n]) return 0;
for(i=n-1;i>=0;--i)
if(!b[i]||(b[i]!=b[i+1]-1))
{
if(b[i+1]!=1)
flag=1;
break;
}
if(flag)
return 0;
if(b[n]==n)
{
printf("0\n");
return 1;
}
cur=b[n]+1;
for(i=1;i<=n;++i)
if(a[i]) se.insert(a[i]);
while(cur<=n)
{
if(se.empty())
return 0;
it=se.begin();
if(*it==cur)
{
se.erase(it);
++cur;
if(b[tp])se.insert(b[tp]);
++tp;
}
else return 0;
}
printf("%d\n",n-b[n]);
return 1;
}
int main()
{
// setIO("input");
int i,j;
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&a[i]);
for(i=1;i<=n;++i)
scanf("%d",&b[i]);
if(!check())
{
int MAX=0;
for(i=1;i<=n;++i)
if(b[i]) MAX=max(MAX,i-b[i]+1);
printf("%d\n",MAX+n);
}
return 0;
}