51nod 1962 区间计数

来源:互联网 发布:少女时代知乎话题 编辑:程序博客网 时间:2024/06/08 00:00

#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);}}


原创粉丝点击