#include<bits/stdc++.h>
using namespace std;
const int MAXN=400400;
pair<int,int> p[MAXN],q[MAXN];
int a[MAXN],b[MAXN],ra[MAXN],rb[MAXN];
int ins(pair<int,int> x,pair<int,int> y)//计算区间并的大小
{
if(x.second>y.second)
swap(x,y);
if(x.second<y.first)
return 0;
return x.second-max(x.first,y.first)+1;
}
int main()
{
int n,i,j;
long long now,ans;
while(~scanf("%d",&n))
{
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
for(i=n;i>=1;i--)
{
for(ra[i]=i+1;ra[i]<=n&&a[ra[i]]<=a[i];ra[i]=ra[ra[i]]);
for(rb[i]=i+1;rb[i]<=n&&b[rb[i]]<=b[i];rb[i]=rb[rb[i]]);
}
for(i=1;i<=n;i=ra[i])
{
p[a[i]]=make_pair(i,ra[i]-1);
}
now=0;
for(i=1;i<=n;i=rb[i])
{
q[b[i]]=make_pair(i,rb[i]-1);
now+=ins(p[b[i]],q[b[i]]);
}
ans=0;
for(i=1;i<=n;i++)
{
ans+=now;
now-=ins(p[a[i]],q[a[i]]);
p[a[i]]=make_pair(0,0);
if(a[i]!=b[i])
{
now-=ins(p[b[i]],q[b[i]]);
q[b[i]]=make_pair(0,0);
}
for(j=i+1;j<ra[i];j=ra[j])
{
p[a[j]]=make_pair(j,ra[j]-1);
now+=ins(p[a[j]],q[a[j]]);
}
for(j=i+1;j<rb[i];j=rb[j])
{
q[b[j]]=make_pair(j,rb[j]-1);
now+=ins(p[b[j]],q[b[j]]);
}
}
printf("%lld\n",ans);
}
}
51nod 1962 区间计数
最新推荐文章于 2018-02-23 18:21:44 发布