类似区间DP
#include<algorithm>
#include<iostream>
#include<vector>
#include<map>
#include<string>
#include<cstdio>
#include<stack>
#include<cmath>
#include<cstring>
#define LL long long
#include<string>
#include<cmath>
#include<queue>
#define lson i<<1
#define rson (i<<1)+1
using namespace std;
int a[200005],b[200005],stA[200005][25],stB[200005][25],n;
void solve()
{
for(int i=1;i<=n;i++)stA[i][0] = a[i];
for(int i=1;i<=n;i++)stB[i][0] = b[i];
for(int i=1;i<=(int)(log(n)/log(2));i++)
for(int j=1;j+(1<<i)-1<=n;j++)
{
stA[j][i] = max(stA[j][i-1],stA[j+(1<<(i-1))][i-1]);
stB[j][i] = min(stB[j][i-1],stB[j+(1<<(i-1))][i-1]);
}
}
int queryA(int l,int r)
{
int pre = (int)(log(r-l+1)/log(2));
return max(stA[l][pre],stA[r-(1<<pre)+1][pre]);
}
int queryB(int l,int r)
{
int pre = (int)(log(r-l+1)/log(2));
return min(stB[l][pre],stB[r-(1<<pre)+1][pre]);
}
int main()
{
scanf("%d",&n);
LL sum = 0;
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++)scanf("%d",&b[i]);
solve();
for(int i=1;i<=n;i++)
{
int l = i,r = n;
int ansl = 0;
while(l<=r)
{
int mid = (l+r)/2,vaA = queryA(i,mid),vaB = queryB(i,mid);
if(vaA<vaB)l = mid+1;
else if(vaA==vaB){ansl = mid;r = mid-1;}
else r = mid-1;
}
l = i,r = n;
int ansr = -1;
while(l<=r)
{
int mid = (l+r)/2,vaA = queryA(i,mid),vaB = queryB(i,mid);
if(vaA<vaB)l = mid+1;
else if(vaA==vaB){ansr = mid;l = mid+1;}
else r = mid-1;
}
sum+=ansr-ansl+1ll;
}
printf("%I64d\n",sum);
return 0;
}