51nod 1962 區間計數

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


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章