1try

来源:互联网 发布:淘宝调研网站 编辑:程序博客网 时间:2024/05/20 19:46


#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <algorithm>#include <vector>using namespace std;typedef long long LL;const int N=222222;LL Max[N][18],Min[N][18];int a[N],b[N],bit[N],n;LL Calc(int i,int mid,int k){    return max(Max[i][k],Max[mid+1-(1<<k)][k])-min(Min[i][k],Min[mid+1-(1<<k)][k]);}int main(){    //freopen("1.txt","r",stdin);    int k=0;    bit[1]=0;    for (int i=2;i<N;i++){        if (i>=(1<<k+1))k++;        bit[i]=k;    }    //for (int i=1;i<=100;i++)printf("%d %d\n",i,bit[i]);    scanf("%d",&n);    for (int i=1;i<=n;i++)scanf("%d",&a[i]),Max[i][0]=a[i];//LL    for (int i=1;i<=n;i++)scanf("%d",&b[i]),Min[i][0]=b[i];    for (int L=1;L<=bit[n];L++)for (int i=1;i+(1<<L)-1<=n;i++){        Max[i][L]=max(Max[i][L-1],Max[i+(1<<L-1)][L-1]);        Min[i][L]=min(Min[i][L-1],Min[i+(1<<L-1)][L-1]);    }    LL Res=0;    for (int i=1;i<=n;i++){        int L=i,R=n,mid,Ans1=i,Ans2=n;        while (L<=R){            mid=(L+R)>>1;            if (Calc(i,mid,bit[mid+1-i])<=0)Ans1=mid,L=mid+1;            else R=mid-1;        }        if (Calc(i,Ans1,bit[Ans1+1-i])!=0)continue;        L=i,R=n;        while (L<=R){            mid=(L+R)>>1;            if (Calc(i,mid,bit[mid+1-i])>=0)Ans2=mid,R=mid-1;            else L=mid+1;        }        Res+=Ans1-Ans2+1;    }    cout<<Res<<endl;    return 0;}



0 0
原创粉丝点击