题目并不难,思维题一定要把逻辑理清,否则不知道要debug多久。
int a[N], b[N];
int main()
{
int n;
while (cin >> n)
{
f(i, 1, n)scanf("%d", &a[i]);
f(i, 1, n)scanf("%d", &b[i]);
int pos = 1;
while (b[pos] != 1&&pos<=n)pos++;
if (pos == n + 1)goto p2;
else goto p1;
while (0)//1在b
{//先检查1的后续是否需要跟新
p1:int depth = pos;
int fg = 0,fg3=1;
f(i, pos + 1, n)
{
if (b[i] - 1 != i - pos)fg3 = 0;
if (b[i]!=0)
{
if (b[i] - 1 < i - pos)depth =max( pos + (i - pos) - (b[i] - 1),depth);//有不符合必>n
}
else fg = 1;//有0必>n
}
if (depth > pos||fg)
cout << n + depth << endl;
else//是否可小于n(在需某个值时,它已经出队)
{
int now = b[n];//6
int fg2 = 0;
f(i, 1, pos - 1)
{
if (b[i] == 0)continue;
int gp = b[i] - now;//等待时间 7 8 1 2 3 4 5 6
if (i>=gp)fg2 = 1;//n+pos
}
if (fg2||!fg3)cout << n + pos << endl;
else cout << pos-1 << endl;
}
}
while (0)//1在 a
{
p2:
int gp = 0;
f(i, 1, n)
{
if (b[i] == 0)continue;
if (b[i] - 1 <i)gp = max(gp, i - b[i] + 1);//4 3 0 0 0(gp=0)
}
cout << gp + n << endl;
}
}
return 0;
}