思路

因为 aa 是一个排列,所以我们可以记录 ii 出现的位置 pip_i

根据 pip_i,我们可以递推出 lil_irir_i 满足 Mexli,ri=i+1\operatorname{Mex}_{l_i, r_i} = i + 1rili+1r_i - l_i + 1 最小。根据 Mex\operatorname{Mex} 的定义,li=min(li1,pi)l_i = \min(l_i - 1, p_i)ri=max(ri1,pi)r_i = \max(r_i - 1, p_i)

我们可以再处理出 sis_i 代表区间长度为 ii 的最大 Mex\operatorname{Mex} 值。

Mex\operatorname{Mex} 值为 xx 且长度 ll 最小,相当于 xx 就是满足长度为 ll 的最大 Mex\operatorname{Mex} 值,所以对于每一个 iisrili+1=i+1s_{r_i - l_i + 1} = i + 1

如果 LlL \le lrRr \le RMexL,RMexl,r\operatorname{Mex}_{L, R} \ge \operatorname{Mex}_{l, r},所以 sis_i 还要和 maxj=1i1sj\max_{j = 1}^{i - 1} s_j 取最大值。

处理出 sis_i 后,枚举区间长度 ii,判断是否满足 si>fis_i > f_i 即可。

代码

#include <algorithm>
#include <cstdio>

using namespace std;

int n, x, p[4000001], a[4000001], l, r, s[4000001], ans;
int main(){
	scanf("%d", &n);
	for (int i = 1;i <= n;i ++) scanf("%d", &x), p[x] = i;
	for (int i = 1;i <= n;i ++) scanf("%d", &a[i]);
	l = r = p[1], s[1] = 2;
	for (int i = 2;i <= n;i ++) l = min(l, p[i]), r = max(r, p[i]), s[r - l + 1] = i + 1;
	for (int i = 1;i <= n;i ++) s[i] = max(s[i - 1], s[i]);
	for (int i = 1;i <= n;i ++){
		if (s[i] > a[i]){
			printf("%d", i);
			return 0;
		}
	}
	printf("%d", 0);
}