思路
因为 是一个排列,所以我们可以记录 出现的位置 。
根据 ,我们可以递推出 和 满足 且 最小。根据 的定义,,。
我们可以再处理出 代表区间长度为 的最大 值。
值为 且长度 最小,相当于 就是满足长度为 的最大 值,所以对于每一个 ,。
如果 且 ,,所以 还要和 取最大值。
处理出 后,枚举区间长度 ,判断是否满足 即可。
代码
#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);
}